source: binary-improvements2/7dtd-server-fixes/src/JSON/JSONObject.cs@ 393

Last change on this file since 393 was 391, checked in by alloc, 2 years ago

Major refactoring/cleanup

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