public override IObjectBuilder CreateObjectBuilder(ITypeBuilderRegistry registry) { throw new InvalidClassForDeserializationException( string.Format( "Cannot deserialilze json into dictionary of type {0}. Dictionary key type must be string.", _dictionaryType)); }
public object Parse(ITypeBuilderRegistry registry, ITypeBuilder builder, object instanceState) { SkipWhitespace(); var c = Peek(); switch (c) { case '{': return ParseObject(registry, builder, instanceState); case '[': return ParserArray(registry, builder, instanceState); case '\"': return ParseString(registry, builder); case 't': return ParseTrue(registry, builder); case 'f': return ParseFalse(registry, builder); case 'n': return ParseNull(registry, builder); default: if (char.IsDigit((char) c) || (c == '-')) { return ParseNumber(registry, builder); } break; } throw CreateException("Expected Json at ({1},{2})", c, Line, Column); }
public object CreateNewObject(ITypeBuilderRegistry registry, object instanceState) { if (instanceState is IJsonObject) { return instanceState as IJsonObject; } return new JsonObject(); }
public virtual object CreateDateTime(ITypeBuilderRegistry registry, DateTime value, object sourceValue) { if (sourceValue is string) { return new JsonDateAndString(value, sourceValue as string); } return new JsonDate(value); }
public object CreateString(ITypeBuilderRegistry registry, string value) { string interned; if (!_interned.TryGetValue(value, out interned)) { interned = value; _interned.Add(value, interned); } return interned; }
public object CreateNumber(ITypeBuilderRegistry registry, double value) { return _convert(_inner.CreateNumber(registry, value)); }
public object CreateBool(ITypeBuilderRegistry registry, bool value) { return _convert(_inner.CreateBool(registry, value)); }
public object CreateNewArray(ITypeBuilderRegistry registry, object instanceState) { return new JsonArray(); }
public object CreateString(ITypeBuilderRegistry registry, string value) { return _convert(_inner.CreateString(registry, value)); }
protected object ParseNull(ITypeBuilderRegistry registry, ITypeBuilder builder) { Match("null"); return builder.CreateNull(registry); }
protected object ParserArray(ITypeBuilderRegistry registry, ITypeBuilder builder, object instanceState) { Match('['); SkipWhitespace(); var arrayBuilder = builder.CreateArrayBuilder(registry); var array = arrayBuilder.CreateNewArray(registry, instanceState); while (Peek() != ']') { arrayBuilder.AddElement(array, Parse(registry, arrayBuilder.GetElementBuilder(registry), null)); SkipWhitespace(); if (!TryMatch(',')) { break; } SkipWhitespace(); } Match(']'); return arrayBuilder.GetArray(array); }
public object CreateBool(ITypeBuilderRegistry registry, bool value) { return value; }
protected object ParseFalse(ITypeBuilderRegistry registry, ITypeBuilder builder) { Match("false"); return builder.CreateBool(registry, false); }
public object CreateNumber(ITypeBuilderRegistry registry, long value) { return (int) value; }
public object CreateNumber(ITypeBuilderRegistry registry, double value) { return value; }
public object CreateString(ITypeBuilderRegistry registry, string value) { return value; }
public IArrayBuilder CreateArrayBuilder(ITypeBuilderRegistry registry) { return _arrayBuilder; }
public IObjectBuilder CreateObjectBuilder(ITypeBuilderRegistry registry) { return _dictionaryBuilder; }
public object CreateDateTime(ITypeBuilderRegistry registry, DateTime value, object sourceValue) { return _convert(_inner.CreateDateTime(registry, value, sourceValue)); }
public object CreateDateTime(ITypeBuilderRegistry registry, DateTime value, object sourceValue) { return value; }
public object CreateNull(ITypeBuilderRegistry registry) { return _convert(_inner.CreateNull(registry)); }
protected object ParseObject(ITypeBuilderRegistry registry, ITypeBuilder builder, object instanceState) { Match('{'); SkipWhitespace(); var objectBuilder = builder.CreateObjectBuilder(registry); var @object = objectBuilder.CreateNewObject(registry, instanceState); while (Peek() != '}') { var memberName = ParseString(); SkipWhitespace(); Match(':'); var memberState = objectBuilder.GetMemberState(memberName, @object); objectBuilder.SetMember(memberName, @object, Parse(registry, objectBuilder.GetMemberBuilder(registry, memberName), memberState)); SkipWhitespace(); if (!TryMatch(',')) { break; } SkipWhitespace(); } Match('}'); return objectBuilder.GetObject(@object); }
protected object ParseTrue(ITypeBuilderRegistry registry, ITypeBuilder builder) { Match("true"); return builder.CreateBool(registry, true); }
public virtual IObjectBuilder CreateObjectBuilder(ITypeBuilderRegistry registry) { return new JsonObjectBuilder(); }
protected object ParseString(ITypeBuilderRegistry registry, ITypeBuilder builder) { var s = ParseString(); var dt = JsonFormats.TryParseDateTime(s); return dt.HasValue ? builder.CreateDateTime(registry, dt.Value, s) : builder.CreateString(registry, s); }
public IArrayBuilder CreateArrayBuilder(ITypeBuilderRegistry registry) { var builder = _inner.CreateArrayBuilder(registry); return builder == null ? null : new ConvertingArrayBuilder(builder, _convert); }
public object CreateNull(ITypeBuilderRegistry registry) { return null; }
public ITypeBuilder GetElementBuilder(ITypeBuilderRegistry registry) { return this; }
/* * number = [ minus ] int [ frac ] [ exp ] * decimal-point = %x2E ; . * digit1-9 = %x31-39 ; 1-9 * e = %x65 / %x45 ; e E * exp = e [ minus / plus ] 1*DIGIT * frac = decimal-point 1*DIGIT * int = zero / ( digit1-9 *DIGIT ) * minus = %x2D ; - * plus = %x2B ; + * zero = %x30 ; 0 */ private object ParseNumber(ITypeBuilderRegistry registry, ITypeBuilder builder) { var startLine = Line; var startColumn = Column; var sb = new StringBuilder(); if (Peek() == '-') { sb.Append(Next()); } var hasInteger = false; while (char.IsDigit((char) Peek())) { sb.Append(Next()); hasInteger = true; } if (!hasInteger) { throw CreateExpectedNumberException(startLine, startColumn); } if (Peek() != '.') { long intValue; if (!long.TryParse(sb.ToString(), out intValue)) { throw CreateExpectedNumberException(startLine, startColumn); } return builder.CreateNumber(registry, intValue); } sb.Append(Next()); var hasFrac = false; while (char.IsDigit((char) Peek())) { sb.Append(Next()); hasFrac = true; } if (!hasFrac) { throw CreateExpectedNumberException(startLine, startColumn); } if ("eE".IndexOf((char) Peek()) >= 0) { sb.Append(Next()); if ("+-".IndexOf((char) Peek()) >= 0) { sb.Append(Next()); } var hasExp = false; while (char.IsDigit((char) Peek())) { sb.Append(Next()); hasExp = true; } if (!hasExp) { throw CreateExpectedNumberException(startLine, startColumn); } } double doubleValue; if (!double.TryParse(sb.ToString(), NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent, JsonFormats.DoubleFormat, out doubleValue)) { throw CreateExpectedNumberException(startLine, startColumn); } return builder.CreateNumber(registry, doubleValue); }
public static Func<ITypeBuilder> CreateTypeBuilderFactory(ITypeBuilderRegistry registry) { var builder = new SystemObjectBuilder(); return () => builder; }