internal void ReadContentFrom(JsonReader r) { ValidationUtils.ArgumentNotNull(r, "r"); IJsonLineInfo lineInfo = r as IJsonLineInfo; JContainer parent = this; do { if (parent is JProperty && ((JProperty)parent).Value != null) { if (parent == this) { return; } parent = parent.Parent; } switch (r.TokenType) { case JsonToken.None: // new reader. move to actual content break; case JsonToken.StartArray: JArray a = new JArray(); a.SetLineInfo(lineInfo); parent.AddObjectSkipNotify(a); parent = a; break; case JsonToken.EndArray: if (parent == this) { return; } parent = parent.Parent; break; case JsonToken.StartObject: JObject o = new JObject(); o.SetLineInfo(lineInfo); parent.AddObjectSkipNotify(o); parent = o; break; case JsonToken.EndObject: if (parent == this) { return; } parent = parent.Parent; break; case JsonToken.StartConstructor: JConstructor constructor = new JConstructor(r.Value.ToString()); constructor.SetLineInfo(constructor); parent.AddObjectSkipNotify(constructor); parent = constructor; break; case JsonToken.EndConstructor: if (parent == this) { return; } parent = parent.Parent; break; case JsonToken.String: case JsonToken.Integer: case JsonToken.Float: case JsonToken.Date: case JsonToken.Boolean: JValue v = new JValue(r.Value); v.SetLineInfo(lineInfo); parent.AddObjectSkipNotify(v); break; case JsonToken.Comment: v = JValue.CreateComment(r.Value.ToString()); v.SetLineInfo(lineInfo); parent.AddObjectSkipNotify(v); break; case JsonToken.Null: v = new JValue(null, JsonTokenType.Null); v.SetLineInfo(lineInfo); parent.AddObjectSkipNotify(v); break; case JsonToken.Undefined: v = new JValue(null, JsonTokenType.Undefined); v.SetLineInfo(lineInfo); parent.AddObjectSkipNotify(v); break; case JsonToken.PropertyName: JProperty property = new JProperty(r.Value.ToString()); property.SetLineInfo(lineInfo); parent.AddObjectSkipNotify(property); parent = property; break; default: throw new InvalidOperationException("The JsonReader should not be on a token of type {0}.".FormatWith(CultureInfo.InvariantCulture, r.TokenType)); } }while (r.Read()); }