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

Last change on this file since 441 was 351, checked in by alloc, 6 years ago

Fixed game version compatibility of GamePrefs
Code style cleanup (mostly argument names)

File size: 2.8 KB
Line 
1using System.Collections.Generic;
2using System.Text;
3
4namespace AllocsFixes.JSON {
5 public class JSONObject : JSONNode {
6 private readonly Dictionary<string, JSONNode> nodes = new Dictionary<string, JSONNode> ();
7
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
21 public bool ContainsKey (string _name) {
22 return nodes.ContainsKey (_name);
23 }
24
25 public void Add (string _name, JSONNode _node) {
26 nodes.Add (_name, _node);
27 }
28
29 public override void ToString (StringBuilder _stringBuilder, bool _prettyPrint = false, int _currentLevel = 0) {
30 _stringBuilder.Append ("{");
31 if (_prettyPrint) {
32 _stringBuilder.Append ('\n');
33 }
34
35 foreach (KeyValuePair<string, JSONNode> kvp in nodes) {
36 if (_prettyPrint) {
37 _stringBuilder.Append (new string ('\t', _currentLevel + 1));
38 }
39
40 _stringBuilder.Append (string.Format ("\"{0}\":", kvp.Key));
41 if (_prettyPrint) {
42 _stringBuilder.Append (" ");
43 }
44
45 kvp.Value.ToString (_stringBuilder, _prettyPrint, _currentLevel + 1);
46 _stringBuilder.Append (",");
47 if (_prettyPrint) {
48 _stringBuilder.Append ('\n');
49 }
50 }
51
52 if (nodes.Count > 0) {
53 _stringBuilder.Remove (_stringBuilder.Length - (_prettyPrint ? 2 : 1), 1);
54 }
55
56 if (_prettyPrint) {
57 _stringBuilder.Append (new string ('\t', _currentLevel));
58 }
59
60 _stringBuilder.Append ("}");
61 }
62
63 public static JSONObject Parse (string _json, ref int _offset) {
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] != ':') {
77 throw new MalformedJSONException (
78 "Could not parse object, missing colon (\":\") after key");
79 }
80
81 _offset++;
82 JSONNode val = Parser.ParseInternal (_json, ref _offset);
83 obj.Add (key.GetString (), val);
84 nextElemAllowed = false;
85 } else {
86 throw new MalformedJSONException (
87 "Could not parse object, found new key without a separating comma");
88 }
89
90 break;
91 case ',':
92 if (!nextElemAllowed) {
93 nextElemAllowed = true;
94 _offset++;
95 } else {
96 throw new MalformedJSONException (
97 "Could not parse object, found a comma without a key/value pair first");
98 }
99
100 break;
101 case '}':
102 _offset++;
103
104 //Log.Out ("JSON:Parsed Object: " + obj.ToString ());
105 return obj;
106 default:
107 break;
108 }
109 }
110 }
111 }
112}
Note: See TracBrowser for help on using the repository browser.