using System; using System.Text; using System.Collections.Generic; using ln.collections; using ln.json.mapping; namespace ln.json { public class JSONObject : JSONValue { public IEnumerable Keys => values.Keys; public override IEnumerable Children => values.Values; public override bool HasChildren => true; public int Count => values.Count; BTree values = new BTree(); public JSONObject() :base(JSONValueType.OBJECT){} public override JSONValue this[string property] { get => values[property]; set => values[property] = value; } public JSONObject Add(string propertyName, JSONValue value) { values[propertyName] = value; return this; } public JSONObject Add(string propertyName, object value) { if (JSONMapper.DefaultMapper.Serialize(value,out JSONValue jsonValue)) { values[propertyName] = jsonValue; } return this; } public bool ContainsKey(string key) { return values.ContainsKey(key); } public T ToObject() { if (JSONMapper.DefaultMapper.Deserialize(this, typeof(T), out object o)) { return (T)o; } throw new NotSupportedException(); } public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append('{'); IEnumerator kenum = values.Keys.GetEnumerator(); if (kenum.MoveNext()) do { sb.Append('"'); sb.Append(kenum.Current); sb.Append('"'); sb.Append(':'); sb.Append(values[kenum.Current].ToString()); if (!kenum.MoveNext()) break; sb.Append(','); } while (true); sb.Append('}'); return sb.ToString(); } public static JSONObject From(object value) { if (JSONMapper.DefaultMapper.Serialize(value, out JSONValue json)) { return (JSONObject)json; } throw new NotSupportedException(); } } }