public JsonValue Read() { JsonValue cur = null; string lastPropName = null; Stack<JsonValue> stack = new Stack<JsonValue> (); Stack<string> propNameStack = new Stack<string> (); JsonReader reader = _reader; while (reader.Read ()) { switch (reader.Token) { case JsonToken.ArrayStart: case JsonToken.ObjectStart: if (cur != null) { stack.Push (cur); if (cur is JsonObject) { propNameStack.Push (lastPropName); lastPropName = null; } } if (reader.Token == JsonToken.ArrayStart) cur = new JsonArray (new List<JsonValue> ()); else cur = new JsonObject (new Dictionary<string,JsonValue> ()); break; case JsonToken.ObjectEnd: case JsonToken.ArrayEnd: if (stack.Count == 0) return cur; JsonValue parent = stack.Pop (); if (parent is JsonArray) { (parent as JsonArray).Value.Add (cur); } else if (parent is JsonObject) { lastPropName = propNameStack.Pop (); if (lastPropName == null) throw new JsonException (); (parent as JsonObject).Value.Add (lastPropName, cur); lastPropName = null; } cur = parent; break; case JsonToken.PropertyName: if (lastPropName != null) throw new JsonException (); lastPropName = (string)reader.Value; break; case JsonToken.Boolean: case JsonToken.Null: case JsonToken.Number: case JsonToken.String: JsonValue value; switch (reader.Token) { case JsonToken.Boolean: value = new JsonBoolean ((bool)reader.Value); break; case JsonToken.Null: value = new JsonNull (); break; case JsonToken.Number: value = new JsonNumber (Convert (reader.NumberType), (double)reader.Value, reader.ValueSignedInteger, reader.ValueUnsignedInteger); break; case JsonToken.String: value = new JsonString ((string)reader.Value); break; default: throw new JsonException (); } if (cur == null) return value; if (cur is JsonArray) { (cur as JsonArray).Value.Add (value); } else if (cur is JsonObject) { if (lastPropName == null) throw new JsonException (); (cur as JsonObject).Value.Add (lastPropName, value); lastPropName = null; } break; } } if (cur == null) return null; throw new JsonException (); }
public JsonValue Read() { JsonValue cur = null; string lastPropName = null; Stack <JsonValue> stack = new Stack <JsonValue> (); Stack <string> propNameStack = new Stack <string> (); JsonReader reader = _reader; while (reader.Read()) { switch (reader.Token) { case JsonToken.ArrayStart: case JsonToken.ObjectStart: if (cur != null) { stack.Push(cur); if (cur is JsonObject) { propNameStack.Push(lastPropName); lastPropName = null; } } if (reader.Token == JsonToken.ArrayStart) { cur = new JsonArray(new List <JsonValue> ()); } else { cur = new JsonObject(new Dictionary <string, JsonValue> ()); } break; case JsonToken.ObjectEnd: case JsonToken.ArrayEnd: if (stack.Count == 0) { return(cur); } JsonValue parent = stack.Pop(); if (parent is JsonArray) { (parent as JsonArray).Value.Add(cur); } else if (parent is JsonObject) { lastPropName = propNameStack.Pop(); if (lastPropName == null) { throw new JsonException(); } (parent as JsonObject).Value.Add(lastPropName, cur); lastPropName = null; } cur = parent; break; case JsonToken.PropertyName: if (lastPropName != null) { throw new JsonException(); } lastPropName = (string)reader.Value; break; case JsonToken.Boolean: case JsonToken.Null: case JsonToken.Number: case JsonToken.String: JsonValue value; switch (reader.Token) { case JsonToken.Boolean: value = new JsonBoolean((bool)reader.Value); break; case JsonToken.Null: value = new JsonNull(); break; case JsonToken.Number: value = new JsonNumber(Convert(reader.NumberType), (double)reader.Value, reader.ValueSignedInteger, reader.ValueUnsignedInteger); break; case JsonToken.String: value = new JsonString((string)reader.Value); break; default: throw new JsonException(); } if (cur == null) { return(value); } if (cur is JsonArray) { (cur as JsonArray).Value.Add(value); } else if (cur is JsonObject) { if (lastPropName == null) { throw new JsonException(); } (cur as JsonObject).Value.Add(lastPropName, value); lastPropName = null; } break; } } if (cur == null) { return(null); } throw new JsonException(); }