private object DeserializeMembers(IJsonReader reader, Dictionary <string, object> container, ref ObjectSerializer serializerOverride) { while (reader.NextToken() && reader.Token != JsonToken.EndOfObject) { if (reader.Token != JsonToken.Member) { throw new UnexpectedToken(reader, JsonToken.Member); } string memberName = null; object value = null; memberName = reader.Value.AsString; // string if (string.Equals(memberName, TYPE_MEMBER_NAME) && this.SuppressTypeInformation == false) { reader.NextToken(); var typeName = reader.ReadString(false); var type = reader.Context.GetType(typeName, true, true); var serializer = reader.Context.GetSerializerForType(type); if (serializer is ObjectSerializer) { serializerOverride = (ObjectSerializer)serializer; serializerOverride.DeserializeMembers(reader, container, ref serializerOverride); return(null); } else { reader.NextToken(); // advance to next member serializerOverride = null; return(serializer.Deserialize(reader)); } } var member = default(DataMemberDescription); var valueType = typeof(object); if (this.TryGetMember(memberName, out member)) { valueType = member.ValueType; } reader.NextToken(); try { value = reader.ReadValue(valueType, false); } catch (Exception e) { throw new SerializationException(string.Format("Failed to read value for member '{0}' of '{1}' type.\r\nMore detailed information in inner exception.", memberName, this.objectType.Name), e); } container[memberName] = value; } return(null); }
public static DateTime ReadDateTime(this IJsonReader reader, bool nextToken = true) { if (reader == null) { throw new ArgumentNullException("reader"); } var value = default(DateTime); if (reader.Token == JsonToken.Member || reader.Token == JsonToken.StringLiteral || reader.Token == JsonToken.Number || reader.Token == JsonToken.DateTime) { value = reader.Value.AsDateTime; } else { throw JsonSerializationException.UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Number, JsonToken.DateTime); } if (nextToken) { reader.NextToken(); } return(value); }
public static DateTime ReadDateTime(this IJsonReader reader, bool advance = true) { if (reader == null) { throw new ArgumentNullException("reader"); } var value = default(DateTime); if (reader.Token == JsonToken.StringLiteral || reader.Token == JsonToken.Number || reader.Token == JsonToken.DateTime) { value = reader.Value.AsDateTime; } else { throw new UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Number, JsonToken.DateTime); } if (!reader.IsEndOfStream() && advance) { reader.NextToken(); } return(value); }
public static DateTime?ReadDateTimeOrNull(this IJsonReader reader, bool nextToken = true) { if (reader == null) { throw new ArgumentNullException("reader"); } var value = default(DateTime?); switch (reader.Token) { case JsonToken.Null: value = null; break; case JsonToken.Member: case JsonToken.StringLiteral: case JsonToken.Number: case JsonToken.DateTime: value = reader.Value.AsDateTime; break; default: throw JsonSerializationException.UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Number, JsonToken.DateTime); } if (nextToken) { reader.NextToken(); } return(value); }
public static bool?ReadBooleanOrNull(this IJsonReader reader, bool advance = true) { if (reader == null) { throw new ArgumentNullException("reader"); } var value = default(bool?); switch (reader.Token) { case JsonToken.Null: value = null; break; case JsonToken.StringLiteral: case JsonToken.Boolean: value = reader.Value.AsBoolean; break; default: throw new UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Boolean); } if (!reader.IsEndOfStream() && advance) { reader.NextToken(); } return(value); }
public static bool ReadBoolean(this IJsonReader reader, bool advance = true) { if (reader == null) { throw new ArgumentNullException("reader"); } var value = default(bool); if (reader.Token == JsonToken.StringLiteral || reader.Token == JsonToken.Boolean) { value = reader.Value.AsBoolean; } else { throw new UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Boolean); } if (!reader.IsEndOfStream() && advance) { reader.NextToken(); } return(value); }
public static string ReadString(this IJsonReader reader, bool nextToken = true) { if (reader == null) { throw new ArgumentNullException("reader"); } var stringValue = default(string); switch (reader.Token) { case JsonToken.Null: break; case JsonToken.Member: case JsonToken.StringLiteral: case JsonToken.Number: case JsonToken.DateTime: case JsonToken.Boolean: stringValue = Convert.ToString(reader.RawValue, reader.Context.Format); break; default: throw JsonSerializationException.UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Number, JsonToken.DateTime, JsonToken.Boolean); } if (nextToken) { reader.NextToken(); } return(stringValue); }
/// <summary> /// Read a literal number /// </summary> /// <param name="reader">The reader to read from</param> /// <param name="type">The number type to return</param> /// <returns>A number of specified type, or throws an InvalidDataException</returns> public static object ReadLiteralNumber(this IJsonReader reader, Type type) { switch (reader.GetLiteralKind()) { case LiteralKind.String: var value = Convert.ChangeType(reader.GetLiteralString(), type, CultureInfo.InvariantCulture); reader.NextToken(); return(value); case LiteralKind.SignedInteger: case LiteralKind.UnsignedInteger: { var str = reader.GetLiteralString(); if (str.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase)) { var tempValue = Convert.ToUInt64(str.Substring(2), 16); object val = Convert.ChangeType(tempValue, type, CultureInfo.InvariantCulture); reader.NextToken(); return(val); } else { object val = Convert.ChangeType(str, type, CultureInfo.InvariantCulture); reader.NextToken(); return(val); } } case LiteralKind.FloatingPoint: { object val = Convert.ChangeType(reader.GetLiteralString(), type, CultureInfo.InvariantCulture); reader.NextToken(); return(val); } } throw new InvalidDataException("expected a numeric literal"); }
private void SkipObject(IJsonReader reader) { reader.ReadObjectBegin(); int objectBegins = 1; while (objectBegins > 0) { switch (reader.Token) { case JsonToken.BeginObject: objectBegins++; break; case JsonToken.EndOfObject: objectBegins--; break; } reader.NextToken(); } }
public static object ReadValue(this IJsonReader reader, Type valueType, bool advance = true) { if (reader == null) { throw new ArgumentNullException("reader"); } // try guess type if (valueType == typeof(object) && reader.Token != JsonToken.BeginObject) { valueType = reader.Value.ProbableType; } if (valueType != null && valueType.IsInstantiationOf(typeof(Nullable <>))) { if (reader.Token == JsonToken.Null) { return(null); } valueType = valueType.GetGenericArguments()[0]; } if (valueType == null) { valueType = typeof(object); } if (reader.Token == JsonToken.Null) { if (valueType.IsValueType) { reader.ThrowUnexpectedToken(JsonToken.BeginArray, JsonToken.BeginObject, JsonToken.StringLiteral, JsonToken.Number, JsonToken.Boolean, JsonToken.DateTime); } return(null); } var serializer = reader.Context.GetSerializerForType(valueType); var value = serializer.Deserialize(reader); if (!reader.IsEndOfStream() && advance) { reader.NextToken(); } return(value); }
public static void ReadNull(this IJsonReader reader, bool advance = true) { if (reader == null) { throw new ArgumentNullException("reader"); } if (reader.Token != JsonToken.Null) { throw new UnexpectedToken(reader, JsonToken.Null); } if (!reader.IsEndOfStream() && advance) { reader.NextToken(); } }
public static void ReadNull(this IJsonReader reader, bool nextToken = true) { if (reader == null) { throw new ArgumentNullException("reader"); } if (reader.Token != JsonToken.Null) { throw JsonSerializationException.UnexpectedToken(reader, JsonToken.Null); } if (nextToken) { reader.NextToken(); } }
public override object Deserialize(IJsonReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } if (reader.Token == JsonToken.Null) { return(null); } var container = new ArrayList(); if (reader.Token != JsonToken.BeginArray) { throw JsonSerializationException.UnexpectedToken(reader, JsonToken.BeginArray); } reader.Context.Hierarchy.Push(container); while (reader.NextToken() && reader.Token != JsonToken.EndOfArray) { var value = reader.ReadValue(this.elementType, false); container.Add(value); } reader.Context.Hierarchy.Pop(); if (reader.IsEndOfStream()) { throw JsonSerializationException.UnexpectedToken(reader, JsonToken.EndOfArray); } if (this.instantiatedArrayType == typeof(ArrayList)) { return(container); } else if (this.instantiatedArrayType.IsArray) { return(container.ToArray(this.elementType)); } else { return(Activator.CreateInstance(this.instantiatedArrayType, container.ToArray(this.elementType))); } }
private static PointComplex ParseJson(IJsonReader r) { if (r.GetLiteralKind() == LiteralKind.String) { var parts = ((string)r.GetLiteralString()).Split(','); if (parts.Length == 2) { var pt = new PointComplex() { X = int.Parse(parts[0], CultureInfo.InvariantCulture), Y = int.Parse(parts[1], CultureInfo.InvariantCulture), }; r.NextToken(); return(pt); } } throw new InvalidDataException("Invalid point"); }
private static PointComplex ParseJson(IJsonReader r) { if (r.GetLiteralKind() == LiteralKind.String) { var parts = ((string)r.GetLiteralString()).Split(','); if (parts.Length == 2) { var pt = new PointComplex() { X = int.Parse(parts[0], CultureInfo.InvariantCulture), Y = int.Parse(parts[0], CultureInfo.InvariantCulture), }; r.NextToken(); return pt; } } throw new InvalidDataException("Invalid point"); }
public static string DebugPrintTokens(this IJsonReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } var output = new StringBuilder(); var stack = new Stack <JsonToken>(); stack.Push(JsonToken.None); while (reader.NextToken()) { var strValue = reader.Token + (reader.Value.HasValue && reader.Value != null ? "[<" + reader.Value.Type.Name + "> " + JsonUtils.EscapeAndQuote(reader.Value.AsString).Trim('"') + "]" : ""); if (stack.Peek() != JsonToken.Member) { var endingTokenIndent = (reader.Token == JsonToken.EndOfObject || reader.Token == JsonToken.EndOfArray ? -1 : 0); output.Append(Environment.NewLine); for (var i = 0; i < System.Linq.Enumerable.Count(stack, t => t != JsonToken.Member && t != JsonToken.None) + endingTokenIndent; i++) { output.Append("\t"); } } else { output.Append(" "); } output.Append(strValue); if (reader.Token == JsonToken.EndOfObject || reader.Token == JsonToken.EndOfArray || stack.Peek() == JsonToken.Member) { stack.Pop(); } if (reader.Token == JsonToken.BeginObject || reader.Token == JsonToken.BeginArray || reader.Token == JsonToken.Member) { stack.Push(reader.Token); } } return(output.ToString()); }
private void SkipArray(IJsonReader reader, bool alreadyStarted) { if (!alreadyStarted) { reader.ReadArrayBegin(); } int arrayBegins = 1; while (arrayBegins > 0) { switch (reader.Token) { case JsonToken.BeginArray: arrayBegins++; break; case JsonToken.EndOfArray: arrayBegins--; break; } reader.NextToken(); } }
public static void ReadArrayBegin(this IJsonReader reader, bool advance = true) { if (reader == null) { throw new ArgumentNullException("reader"); } if (reader.Token != JsonToken.BeginArray) { throw new UnexpectedToken(reader, JsonToken.BeginArray); } if (reader.IsEndOfStream()) { throw new UnexpectedToken(reader, JsonToken.EndOfArray); } if (advance) { reader.NextToken(); } }
public static void ReadObjectBegin(this IJsonReader reader, bool nextToken = true) { if (reader == null) { throw new ArgumentNullException("reader"); } if (reader.Token != JsonToken.BeginObject) { throw JsonSerializationException.UnexpectedToken(reader, JsonToken.BeginObject); } if (reader.IsEndOfStream()) { throw JsonSerializationException.UnexpectedToken(reader, JsonToken.EndOfObject); } if (nextToken) { reader.NextToken(); } }
public static string ReadMember(this IJsonReader reader, bool nextToken = true) { if (reader == null) { throw new ArgumentNullException("reader"); } if (reader.Token != JsonToken.Member) { throw JsonSerializationException.UnexpectedToken(reader, JsonToken.Member); } var memberName = (string)reader.RawValue; if (nextToken) { reader.NextToken(); } return(memberName); }
public static string ReadMember(this IJsonReader reader, bool advance = true) { if (reader == null) { throw new ArgumentNullException("reader"); } if (reader.Token != JsonToken.Member) { throw new UnexpectedToken(reader, JsonToken.Member); } var memberName = (string)reader.RawValue; if (!reader.IsEndOfStream() && advance) { reader.NextToken(); } return(memberName); }
public static object ReadValue(this IJsonReader reader, Type valueType, bool nextToken = true) { if (reader == null) { throw new ArgumentNullException("reader"); } // try guess type if (valueType == typeof(object)) { valueType = reader.Value.Type; } var value = default(object); var isNullable = valueType.IsValueType == false || valueType.IsInstantiationOf(typeof(Nullable <>)); if (reader.Token == JsonToken.Null && isNullable) { value = null; } else { if (isNullable && valueType.IsValueType) { valueType = valueType.GetGenericArguments()[0]; // get subtype of Nullable<T> } var serializer = reader.Context.GetSerializerForType(valueType); value = serializer.Deserialize(reader); } if (nextToken) { reader.NextToken(); } return(value); }
public override object Deserialize(IJsonReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } var container = new List <DictionaryEntry>(); reader.Context.Hierarchy.Push(container); try { if (reader.Token == JsonToken.BeginArray) { while (reader.NextToken() && reader.Token != JsonToken.EndOfArray) { if (reader.Token != JsonToken.BeginArray || !reader.NextToken()) { throw new UnexpectedToken(reader, JsonToken.BeginArray); } object key = null; object value = null; try { key = reader.ReadValue(keyType, false); } catch (Exception e) { throw new SerializationException(string.Format("Failed to read '{0}' key of dictionary: {1}\r\nMore detailed information in inner exception.", keyType.Name, e.Message), e); } if (!reader.NextToken()) { throw new UnexpectedToken(reader, JsonToken.Boolean, JsonToken.DateTime, JsonToken.Number, JsonToken.StringLiteral); } try { value = reader.ReadValue(valueType, false); } catch (Exception e) { throw new SerializationException(string.Format("Failed to read '{0}' value for key '{1}' in dictionary: {2}\r\nMore detailed information in inner exception.", valueType.Name, key, e.Message), e); } container.Add(new DictionaryEntry(key, value)); if (!reader.NextToken() || reader.Token != JsonToken.EndOfArray) { throw new UnexpectedToken(reader, JsonToken.EndOfArray); } } } else if (reader.Token == JsonToken.BeginObject) { while (reader.NextToken() && reader.Token != JsonToken.EndOfObject) { if (reader.Token != JsonToken.Member) { throw new UnexpectedToken(reader, JsonToken.Member); } string key = null; object value = null; try { key = reader.Value.AsString; } catch (Exception e) { throw new SerializationException(string.Format("Failed to read '{0}' key of dictionary: {1}\r\nMore detailed information in inner exception.", keyType.Name, e.Message), e); } if (!reader.NextToken()) { throw new UnexpectedToken(reader, JsonToken.Boolean, JsonToken.DateTime, JsonToken.Number, JsonToken.StringLiteral); } try { value = reader.ReadValue(valueType, false); } catch (Exception e) { throw new SerializationException(string.Format("Failed to read '{0}' value for key '{1}' in dictionary: {2}\r\nMore detailed information in inner exception.", valueType.Name, key, e.Message), e); } container.Add(new DictionaryEntry(key, value)); } } else { throw new UnexpectedToken(reader, JsonToken.BeginObject, JsonToken.BeginArray); } var dictionary = (IDictionary)Activator.CreateInstance(this.dictionaryType); foreach (var kv in container) { var key = kv.Key; var value = kv.Value; if (this.keyType.IsEnum) { key = Enum.Parse(this.keyType, Convert.ToString(key)); } else if (this.keyType != typeof(string) && this.keyType != typeof(object)) { key = Convert.ChangeType(key, this.keyType); } if (dictionary.Contains(key)) { dictionary.Remove(key); } dictionary.Add(key, value); } return(dictionary); } finally { reader.Context.Hierarchy.Pop(); } }
private static void CopyValue(IJsonReader reader, StringBuilder buffer) { if (reader == null) { throw new ArgumentNullException("reader"); } switch (reader.Token) { case JsonToken.None: case JsonToken.EndOfStream: throw new UnexpectedEndOfStream(reader); case JsonToken.DateTime: case JsonToken.EndOfArray: case JsonToken.EndOfObject: case JsonToken.Number: case JsonToken.Member: case JsonToken.Boolean: case JsonToken.StringLiteral: case JsonToken.Null: if (buffer != null) { reader.Value.CopyJsonTo(buffer); } break; case JsonToken.BeginArray: // copy BeginArray token if (buffer != null) { reader.Value.CopyJsonTo(buffer); } reader.NextToken(); // advance // iterate values while (reader.Token != JsonToken.EndOfArray) { // copy Value CopyValue(reader, buffer); reader.NextToken(); if (reader.Token != JsonToken.EndOfArray) { buffer.Append(','); } } // copy EndOfArray token if (buffer != null) { reader.Value.CopyJsonTo(buffer); } break; case JsonToken.BeginObject: // copy BeginObject token if (buffer != null) { reader.Value.CopyJsonTo(buffer); } reader.NextToken(); // advance // iterate values while (reader.Token != JsonToken.EndOfObject) { // copy MemberName token if (buffer != null) { reader.Value.CopyJsonTo(buffer); } reader.NextToken(); if (buffer != null) { buffer.Append(':'); } // copy Value CopyValue(reader, buffer); reader.NextToken(); if (reader.Token != JsonToken.EndOfObject) { buffer.Append(','); } } // copy EndOfObject token if (buffer != null) { reader.Value.CopyJsonTo(buffer); } break; } }