Ejemplo n.º 1
0
        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());
        }