source: binary-improvements/7dtd-server-fixes/src/JSON/JSONObject.cs@ 330

Last change on this file since 330 was 326, checked in by alloc, 6 years ago

More cleanup, allocation improvements

File size: 2.8 KB
RevLine 
[154]1using System.Collections.Generic;
2using System.Text;
3
[325]4namespace AllocsFixes.JSON {
5 public class JSONObject : JSONNode {
6 private readonly Dictionary<string, JSONNode> nodes = new Dictionary<string, JSONNode> ();
[154]7
[187]8 public JSONNode this [string name] {
9 get { return nodes [name]; }
10 set { nodes [name] = value; }
11 }
12
13 public int Count {
14 get { return nodes.Count; }
15 }
16
17 public List<string> Keys {
18 get { return new List<string> (nodes.Keys); }
19 }
20
[325]21 public bool ContainsKey (string name) {
[187]22 return nodes.ContainsKey (name);
23 }
24
[325]25 public void Add (string name, JSONNode node) {
[154]26 nodes.Add (name, node);
27 }
28
[325]29 public override void ToString (StringBuilder stringBuilder, bool prettyPrint = false, int currentLevel = 0) {
[309]30 stringBuilder.Append ("{");
[325]31 if (prettyPrint) {
[309]32 stringBuilder.Append ('\n');
[325]33 }
34
[154]35 foreach (KeyValuePair<string, JSONNode> kvp in nodes) {
[325]36 if (prettyPrint) {
37 stringBuilder.Append (new string ('\t', currentLevel + 1));
38 }
39
40 stringBuilder.Append (string.Format ("\"{0}\":", kvp.Key));
41 if (prettyPrint) {
[309]42 stringBuilder.Append (" ");
[325]43 }
44
[309]45 kvp.Value.ToString (stringBuilder, prettyPrint, currentLevel + 1);
46 stringBuilder.Append (",");
[325]47 if (prettyPrint) {
[309]48 stringBuilder.Append ('\n');
[325]49 }
[154]50 }
[325]51
52 if (nodes.Count > 0) {
[309]53 stringBuilder.Remove (stringBuilder.Length - (prettyPrint ? 2 : 1), 1);
[325]54 }
55
56 if (prettyPrint) {
57 stringBuilder.Append (new string ('\t', currentLevel));
58 }
59
[309]60 stringBuilder.Append ("}");
[154]61 }
62
[325]63 public static JSONObject Parse (string json, ref int offset) {
[187]64 //Log.Out ("ParseObject enter (" + offset + ")");
65 JSONObject obj = new JSONObject ();
66
67 bool nextElemAllowed = true;
68 offset++;
69 while (true) {
70 Parser.SkipWhitespace (json, ref offset);
71 switch (json [offset]) {
72 case '"':
73 if (nextElemAllowed) {
74 JSONString key = JSONString.Parse (json, ref offset);
75 Parser.SkipWhitespace (json, ref offset);
76 if (json [offset] != ':') {
[325]77 throw new MalformedJSONException (
78 "Could not parse object, missing colon (\":\") after key");
[187]79 }
[325]80
[187]81 offset++;
82 JSONNode val = Parser.ParseInternal (json, ref offset);
83 obj.Add (key.GetString (), val);
84 nextElemAllowed = false;
85 } else {
[325]86 throw new MalformedJSONException (
87 "Could not parse object, found new key without a separating comma");
[187]88 }
[325]89
[187]90 break;
91 case ',':
92 if (!nextElemAllowed) {
93 nextElemAllowed = true;
94 offset++;
[325]95 } else {
96 throw new MalformedJSONException (
97 "Could not parse object, found a comma without a key/value pair first");
98 }
99
[187]100 break;
101 case '}':
102 offset++;
[325]103
[187]104 //Log.Out ("JSON:Parsed Object: " + obj.ToString ());
105 return obj;
[326]106 default:
107 break;
[187]108 }
109 }
110 }
[154]111 }
[325]112}
Note: See TracBrowser for help on using the repository browser.