38using System.Collections;
39using System.Collections.Generic;
40using System.Globalization;
70 private Dictionary<string, JSONNode>.Enumerator m_Object;
71 private List<JSONNode>.Enumerator m_Array;
72 public bool IsValid {
get {
return type != Type.None; } }
76 m_Object =
default(Dictionary<string, JSONNode>.
Enumerator);
85 public KeyValuePair<string, JSONNode>
Current
89 if (type == Type.Array)
90 return new KeyValuePair<string, JSONNode>(
string.Empty, m_Array.
Current);
91 else if (type == Type.Object)
93 return new KeyValuePair<string, JSONNode>(
string.Empty,
null);
98 if (type == Type.Array)
100 else if (type == Type.Object)
126 public class LinqEnumerator : IEnumerator<KeyValuePair<string, JSONNode>>, IEnumerable<KeyValuePair<string, JSONNode>>
136 public KeyValuePair<string, JSONNode>
Current {
get {
return m_Enumerator.
Current; } }
137 object IEnumerator.Current {
get {
return m_Enumerator.
Current; } }
157 IEnumerator IEnumerable.GetEnumerator()
163 #endregion Enumerators
165 #region common interface
173 public virtual JSONNode this[
int aIndex] {
get {
return null; }
set { } }
175 public virtual JSONNode this[
string aKey] {
get {
return null; }
set { } }
177 public virtual string Value {
get {
return ""; }
set { } }
179 public virtual int Count {
get {
return 0; } }
181 public virtual bool IsNumber {
get {
return false; } }
182 public virtual bool IsString {
get {
return false; } }
184 public virtual bool IsNull {
get {
return false; } }
185 public virtual bool IsArray {
get {
return false; } }
186 public virtual bool IsObject {
get {
return false; } }
188 public virtual bool Inline {
get {
return false; }
set { } }
231 foreach (var D
in C.DeepChildren)
248 StringBuilder sb =
new StringBuilder();
250 return sb.ToString();
255 StringBuilder sb =
new StringBuilder();
256 WriteToStringBuilder(sb, 0, aIndent,
JSONTextMode.Indent);
257 return sb.ToString();
259 internal abstract void WriteToStringBuilder(StringBuilder aSB,
int aIndent,
int aIndentInc,
JSONTextMode aMode);
262 public IEnumerable<KeyValuePair<string, JSONNode>> Linq {
get {
return new LinqEnumerator(
this); } }
266 #endregion common interface
268 #region typecasting properties
276 if (
double.TryParse(
Value, NumberStyles.Float, CultureInfo.InvariantCulture, out v))
282 Value = value.ToString(CultureInfo.InvariantCulture);
303 if (
bool.TryParse(
Value, out v))
305 return !
string.IsNullOrEmpty(
Value);
309 Value = (value) ?
"true" :
"false";
318 if (
long.TryParse(
Value, out val))
324 Value = value.ToString();
345 #endregion typecasting properties
355 return (d ==
null) ? null : d.
Value;
364 return (d ==
null) ? 0 : d.
AsDouble;
373 return (d ==
null) ? 0 : d.
AsFloat;
382 return (d ==
null) ? 0 : d.
AsInt;
393 return (d ==
null) ? 0L : d.
AsLong;
402 return (d ==
null) ? false : d.
AsBool;
405 public static implicit
operator JSONNode(KeyValuePair<string, JSONNode> aKeyValue)
407 return aKeyValue.
Value;
412 if (ReferenceEquals(a, b))
414 bool aIsNull = a is
JSONNull || ReferenceEquals(a,
null) || a is JSONLazyCreator;
415 bool bIsNull = b is
JSONNull || ReferenceEquals(b,
null) || b is JSONLazyCreator;
416 if (aIsNull && bIsNull)
418 return !aIsNull && a.
Equals(b);
428 return ReferenceEquals(
this, obj);
433 return base.GetHashCode();
439 private static StringBuilder m_EscapeBuilder;
440 internal static StringBuilder EscapeBuilder
444 if (m_EscapeBuilder ==
null)
445 m_EscapeBuilder =
new StringBuilder();
446 return m_EscapeBuilder;
449 internal static string Escape(
string aText)
451 var sb = EscapeBuilder;
453 if (sb.Capacity < aText.Length + aText.Length / 10)
454 sb.Capacity = aText.Length + aText.Length / 10;
455 foreach (
char c
in aText)
484 sb.Append(
"\\u").Append(val.ToString(
"X4"));
491 string result = sb.ToString();
496 private static JSONNode ParseElement(
string token,
bool quoted)
500 string tmp = token.ToLower();
501 if (tmp ==
"false" || tmp ==
"true")
502 return tmp ==
"true";
504 return JSONNull.CreateOrGet();
506 if (
double.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out val))
514 Stack<JSONNode> stack =
new Stack<JSONNode>();
517 StringBuilder Token =
new StringBuilder();
518 string TokenName =
"";
519 bool QuoteMode =
false;
520 bool TokenIsQuoted =
false;
521 while (i < aJSON.Length)
528 Token.Append(aJSON[i]);
534 ctx.
Add(TokenName, stack.Peek());
544 Token.Append(aJSON[i]);
551 ctx.
Add(TokenName, stack.Peek());
563 Token.Append(aJSON[i]);
566 if (stack.Count == 0)
567 throw new Exception(
"JSON Parse: Too many closing brackets");
570 if (Token.Length > 0 || TokenIsQuoted)
571 ctx.
Add(TokenName, ParseElement(Token.ToString(), TokenIsQuoted));
572 TokenIsQuoted =
false;
582 Token.Append(aJSON[i]);
587 TokenIsQuoted =
false;
592 TokenIsQuoted |= QuoteMode;
598 Token.Append(aJSON[i]);
601 if (Token.Length > 0 || TokenIsQuoted)
602 ctx.
Add(TokenName, ParseElement(Token.ToString(), TokenIsQuoted));
603 TokenIsQuoted =
false;
606 TokenIsQuoted =
false;
616 Token.Append(aJSON[i]);
643 string s = aJSON.Substring(i + 1, 4);
644 Token.Append((
char)
int.
Parse(
646 System.Globalization.NumberStyles.AllowHexSpecifier));
657 if (
allowLineComments && !QuoteMode && i + 1 < aJSON.Length && aJSON[i + 1] ==
'/')
659 while (++i < aJSON.Length && aJSON[i] !=
'\n' && aJSON[i] !=
'\r') ;
662 Token.Append(aJSON[i]);
668 Token.Append(aJSON[i]);
675 throw new Exception(
"JSON Parse: Quotation marks seems to be messed up.");
678 return ParseElement(Token.ToString(), TokenIsQuoted);
687 private List<JSONNode> m_List =
new List<JSONNode>();
688 private bool inline =
false;
691 get {
return inline; }
692 set {
inline = value; }
696 public override bool IsArray {
get {
return true; } }
703 if (aIndex < 0 || aIndex >= m_List.Count)
704 return new JSONLazyCreator(
this);
705 return m_List[aIndex];
711 if (aIndex < 0 || aIndex >= m_List.Count)
714 m_List[aIndex] = value;
720 get {
return new JSONLazyCreator(
this); }
731 get {
return m_List.Count; }
743 if (aIndex < 0 || aIndex >= m_List.Count)
746 m_List.RemoveAt(aIndex);
759 node.m_List.Capacity = m_List.Capacity;
760 foreach(var n
in m_List)
780 internal override void WriteToStringBuilder(StringBuilder aSB,
int aIndent,
int aIndentInc,
JSONTextMode aMode)
783 int count = m_List.
Count;
786 for (
int i = 0; i < count; i++)
794 aSB.Append(
' ', aIndent + aIndentInc);
795 m_List[i].WriteToStringBuilder(aSB, aIndent + aIndentInc, aIndentInc, aMode);
798 aSB.AppendLine().Append(
' ', aIndent);
806 private Dictionary<string, JSONNode> m_Dict =
new Dictionary<string, JSONNode>();
808 private bool inline =
false;
811 get {
return inline; }
812 set {
inline = value; }
816 public override bool IsObject {
get {
return true; } }
825 if (m_Dict.ContainsKey(aKey))
828 return new JSONLazyCreator(
this, aKey);
834 if (m_Dict.ContainsKey(aKey))
835 m_Dict[aKey] = value;
837 m_Dict.
Add(aKey, value);
845 if (aIndex < 0 || aIndex >= m_Dict.Count)
847 return m_Dict.ElementAt(aIndex).
Value;
853 if (aIndex < 0 || aIndex >= m_Dict.Count)
855 string key = m_Dict.ElementAt(aIndex).Key;
862 get {
return m_Dict.
Count; }
872 if (m_Dict.ContainsKey(aKey))
873 m_Dict[aKey] = aItem;
875 m_Dict.
Add(aKey, aItem);
878 m_Dict.Add(Guid.NewGuid().ToString(), aItem);
883 if (!m_Dict.ContainsKey(aKey))
892 if (aIndex < 0 || aIndex >= m_Dict.Count)
894 var item = m_Dict.ElementAt(aIndex);
903 var item = m_Dict.Where(k => k.Value == aNode).First();
916 foreach (var n
in m_Dict)
918 node.Add(n.Key, n.Value.Clone());
925 return m_Dict.ContainsKey(aKey);
931 if (m_Dict.TryGetValue(aKey, out res))
940 foreach (KeyValuePair<string, JSONNode> N
in m_Dict)
941 yield
return N.
Value;
945 internal override void WriteToStringBuilder(StringBuilder aSB,
int aIndent,
int aIndentInc,
JSONTextMode aMode)
951 foreach (var k
in m_Dict)
959 aSB.Append(
' ', aIndent + aIndentInc);
960 aSB.Append(
'\"').Append(Escape(k.Key)).Append(
'\"');
965 k.Value.WriteToStringBuilder(aSB, aIndent + aIndentInc, aIndentInc, aMode);
968 aSB.AppendLine().Append(
' ', aIndent);
977 private string m_Data;
980 public override bool IsString {
get {
return true; } }
987 get {
return m_Data; }
1003 internal override void WriteToStringBuilder(StringBuilder aSB,
int aIndent,
int aIndentInc,
JSONTextMode aMode)
1005 aSB.Append(
'\"').Append(Escape(m_Data)).Append(
'\"');
1009 if (base.Equals(obj))
1011 string s = obj as string;
1016 return m_Data == s2.m_Data;
1021 return m_Data.GetHashCode();
1028 private double m_Data;
1036 get {
return m_Data.ToString(CultureInfo.InvariantCulture); }
1040 if (
double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out v))
1047 get {
return m_Data; }
1048 set { m_Data = value; }
1052 get {
return (
long)m_Data; }
1053 set { m_Data = value; }
1071 internal override void WriteToStringBuilder(StringBuilder aSB,
int aIndent,
int aIndentInc,
JSONTextMode aMode)
1075 private static bool IsNumeric(
object value)
1077 return value is
int || value is uint
1078 || value is
float || value is
double
1080 || value is
long || value is ulong
1081 || value is
short || value is ushort
1082 || value is sbyte || value is byte;
1088 if (base.Equals(obj))
1092 return m_Data == s2.m_Data;
1094 return Convert.ToDouble(obj) == m_Data;
1099 return m_Data.GetHashCode();
1106 private bool m_Data;
1114 get {
return m_Data.ToString(); }
1118 if (
bool.TryParse(value, out v))
1124 get {
return m_Data; }
1125 set { m_Data = value; }
1143 internal override void WriteToStringBuilder(StringBuilder aSB,
int aIndent,
int aIndentInc,
JSONTextMode aMode)
1145 aSB.Append((m_Data) ?
"true" :
"false");
1152 return m_Data == (bool)obj;
1157 return m_Data.GetHashCode();
1169 return m_StaticInstance;
1175 public override bool IsNull {
get {
return true; } }
1180 get {
return "null"; }
1185 get {
return false; }
1196 if (
object.ReferenceEquals(
this, obj))
1205 internal override void WriteToStringBuilder(StringBuilder aSB,
int aIndent,
int aIndentInc,
JSONTextMode aMode)
1212 internal partial class JSONLazyCreator : JSONNode
1214 private JSONNode m_Node =
null;
1215 private string m_Key =
null;
1217 public override Enumerator GetEnumerator() {
return new Enumerator(); }
1219 public JSONLazyCreator(JSONNode aNode)
1225 public JSONLazyCreator(JSONNode aNode,
string aKey)
1231 private T Set<T>(T aVal) where T : JSONNode
1236 m_Node.Add(m_Key, aVal);
1241 public override JSONNode
this[
int aIndex]
1243 get {
return new JSONLazyCreator(
this); }
1244 set { Set(
new JSONArray()).Add(value); }
1247 public override JSONNode
this[
string aKey]
1249 get {
return new JSONLazyCreator(
this, aKey); }
1250 set { Set(
new JSONObject()).Add(aKey, value); }
1253 public override void Add(JSONNode aItem)
1255 Set(
new JSONArray()).Add(aItem);
1258 public override void Add(
string aKey, JSONNode aItem)
1260 Set(
new JSONObject()).Add(aKey, aItem);
1263 public static bool operator ==(JSONLazyCreator a,
object b)
1267 return System.Object.ReferenceEquals(a, b);
1270 public static bool operator !=(JSONLazyCreator a,
object b)
1275 public override bool Equals(
object obj)
1279 return System.Object.ReferenceEquals(
this, obj);
1282 public override int GetHashCode()
1287 public override int AsInt
1289 get { Set(
new JSONNumber(0));
return 0; }
1290 set { Set(
new JSONNumber(value)); }
1293 public override float AsFloat
1295 get { Set(
new JSONNumber(0.0f));
return 0.0f; }
1296 set { Set(
new JSONNumber(value)); }
1299 public override double AsDouble
1301 get { Set(
new JSONNumber(0.0));
return 0.0; }
1302 set { Set(
new JSONNumber(value)); }
1305 public override long AsLong
1310 Set(
new JSONString(
"0"));
1312 Set(
new JSONNumber(0.0));
1318 Set(
new JSONString(value.ToString()));
1320 Set(
new JSONNumber(value));
1324 public override bool AsBool
1326 get { Set(
new JSONBool(
false));
return false; }
1327 set { Set(
new JSONBool(value)); }
1330 public override JSONArray AsArray
1332 get {
return Set(
new JSONArray()); }
1335 public override JSONObject AsObject
1337 get {
return Set(
new JSONObject()); }
1339 internal override void WriteToStringBuilder(StringBuilder aSB,
int aIndent,
int aIndentInc,
JSONTextMode aMode)
1346 public static class JSON
1348 public static JSONNode Parse(
string aJSON)
1350 return JSONNode.Parse(aJSON);
override IEnumerable< JSONNode > Children
override JSONNode Clone()
override JSONNode Remove(JSONNode aNode)
override Enumerator GetEnumerator()
override void Add(string aKey, JSONNode aItem)
override JSONNodeType Tag
override JSONNode Remove(int aIndex)
override JSONNode Clone()
override JSONNodeType Tag
override int GetHashCode()
override bool Equals(object obj)
override Enumerator GetEnumerator()
IEnumerator< KeyValuePair< string, JSONNode > > GetEnumerator()
KeyValuePair< string, JSONNode > Current
static bool allowLineComments
virtual JSONNode Remove(JSONNode aNode)
virtual JSONArray AsArray
virtual JSONNode Remove(string aKey)
static bool operator==(JSONNode a, object b)
virtual IEnumerable< JSONNode > Children
override string ToString()
override bool Equals(object obj)
virtual bool HasKey(string aKey)
static bool operator!=(JSONNode a, object b)
override int GetHashCode()
IEnumerable< JSONNode > DeepChildren
Enumerator GetEnumerator()
virtual void Add(JSONNode aItem)
virtual JSONNode GetValueOrDefault(string aKey, JSONNode aDefault)
virtual string ToString(int aIndent)
virtual void Add(string aKey, JSONNode aItem)
virtual JSONNode Remove(int aIndex)
virtual JSONObject AsObject
static JSONNode Parse(string aJSON)
override Enumerator GetEnumerator()
override JSONNodeType Tag
override bool Equals(object obj)
static bool reuseSameInstance
static JSONNull CreateOrGet()
override int GetHashCode()
override JSONNode Clone()
override JSONNodeType Tag
override int GetHashCode()
override Enumerator GetEnumerator()
override bool Equals(object obj)
override JSONNode Clone()
override JSONNode Clone()
override JSONNode Remove(string aKey)
override JSONNode Remove(int aIndex)
override JSONNodeType Tag
override JSONNode Remove(JSONNode aNode)
override Enumerator GetEnumerator()
override bool HasKey(string aKey)
override IEnumerable< JSONNode > Children
override void Add(string aKey, JSONNode aItem)
override JSONNode GetValueOrDefault(string aKey, JSONNode aDefault)
override Enumerator GetEnumerator()
override JSONNode Clone()
override bool Equals(object obj)
override JSONNodeType Tag
override int GetHashCode()
Enumerator(Dictionary< string, JSONNode >.Enumerator aDictEnum)
KeyValuePair< string, JSONNode > Current
Enumerator(List< JSONNode >.Enumerator aArrayEnum)
KeyEnumerator GetEnumerator()
KeyEnumerator(List< JSONNode >.Enumerator aArrayEnum)
KeyEnumerator(Dictionary< string, JSONNode >.Enumerator aDictEnum)
KeyEnumerator(Enumerator aEnumerator)
ValueEnumerator(Dictionary< string, JSONNode >.Enumerator aDictEnum)
ValueEnumerator GetEnumerator()
ValueEnumerator(List< JSONNode >.Enumerator aArrayEnum)
ValueEnumerator(Enumerator aEnumerator)