public void PropertyName(string propertyName) { if (propertyName.Equals(mParent.mTypeProperty, StringComparison.OrdinalIgnoreCase)) { if (mWrappedConsumer != null) { throw new Exception($"The property '{mParent.mTypeProperty}' must only appear once in the JSON object when deserializing type '{mBaseType}'."); } return; } else { if (mWrappedConsumer == null) { if (mParent.mTypeNameResolver.DefaultType == null) { throw new Exception($"The property '{mParent.mTypeProperty}' must be the first property in the JSON object when deserializing type '{mBaseType}'."); } mWrappedConsumer = mParent.GetConverterForType(mParent.mTypeNameResolver.DefaultType).FromObject(mWhenDone); } } mWrappedConsumer.PropertyName(propertyName); }
public static void ParseObject(Tokenizer tokenizer, IJsonObjectConsumer consumer) { tokenizer.MoveNext(); // skip '{' if (tokenizer.CurrentToken.Type == Tokenizer.Token.CurlyClose) { tokenizer.MoveNext(); // skip '}' consumer.Done(); return; } for (; ;) { if (tokenizer.CurrentToken.Type == Tokenizer.Token.None) { throw new ParserException($"Unexpected end of stream reached while parsing object in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position); } if (tokenizer.CurrentToken.Type != Tokenizer.Token.String) { throw new ParserException($"Unexpected token in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}. Property name was expected.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position); } // expect string literal consumer.PropertyName(tokenizer.CurrentToken.StringValue); // expect ':' tokenizer.MoveNext(); if (tokenizer.CurrentToken.Type == Tokenizer.Token.None) { throw new ParserException($"Unexpected end of stream reached while parsing object in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position); } if (tokenizer.CurrentToken.Type != Tokenizer.Token.Colon) { throw new ParserException($"Unexpected token in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}. ':' was expected.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position); } // parse value tokenizer.MoveNext(); // skip ':' ParseValue(tokenizer, consumer); if (tokenizer.CurrentToken.Type == Tokenizer.Token.None) { throw new ParserException($"Unexpected end of stream reached while parsing object in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position); } if (tokenizer.CurrentToken.Type == Tokenizer.Token.CurlyClose) { tokenizer.MoveNext(); // skip '}' consumer.Done(); return; } if (tokenizer.CurrentToken.Type != Tokenizer.Token.Comma) { throw new ParserException($"Unexpected token in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}. Either '}}' or ',' was expected.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position); } tokenizer.MoveNext(); // skip ',' } }
/// <summary> /// Writes this <see cref="JsonObject"/> to a <see cref="IJsonConsumer"/>. /// This is also used internally by <see cref="JsonValue.ToModel(System.Type)"/> and /// <see cref="JsonValue.ToModel{T}"/> in order to convert this generic object /// model to a JSON string or another .NET object. /// </summary> /// <param name="consumer">The consumer.</param> public override void Write(IJsonConsumer consumer) { IJsonObjectConsumer obj = consumer.Object(); foreach (KeyValuePair <string, JsonValue> property in mPropertiesOrdered) { obj.PropertyName(property.Key); property.Value.Write(obj); } obj.Done(); }
public IJsonObjectConsumer Object() { IJsonObjectConsumer obj = mWrappedConsumer.Object(); if (mTypeName != null) { obj.PropertyName(mTypeProperty); obj.String(mTypeName); } return(obj); }
public void String(string value) { if (mWrappedConsumer == null) { if (!mParent.mTypeNameResolver.TryGetType(value, out Type type)) { throw new Exception($"Type name '{value}' is unknown while deserializing type '{mBaseType}'."); } mWrappedConsumer = mParent.GetConverterForType(type).FromObject(mWhenDone); } mWrappedConsumer.String(value); }
public override void Write(object value, IJsonConsumer writer) { if (value == null) { writer.Null(); return; } IJsonObjectConsumer objectConsumer = writer.Object(); foreach (KeyValuePair <string, T> kvp in (Dictionary <string, T>)value) { objectConsumer.PropertyName(kvp.Key); ElementConverter.Write(kvp.Value, objectConsumer); } objectConsumer.Done(); }