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

Last change on this file since 187 was 187, checked in by alloc, 5 years ago

fixes

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