public static void ExpandoObject() { ExpandoObject expando = JsonSerializer.Deserialize <ExpandoObject>(Json); Assert.Equal(8, ((IDictionary <string, object>)expando).Keys.Count); dynamic obj = expando; VerifyPrimitives(); VerifyObject(); VerifyArray(); // Re-serialize string json = JsonSerializer.Serialize <ExpandoObject>(obj); JsonTestHelper.AssertJsonEqual(Json, json); json = JsonSerializer.Serialize <dynamic>(obj); JsonTestHelper.AssertJsonEqual(Json, json); json = JsonSerializer.Serialize(obj); JsonTestHelper.AssertJsonEqual(Json, json); void VerifyPrimitives() { JsonElement jsonElement = obj.MyString; Assert.Equal("Hello", jsonElement.GetString()); jsonElement = obj.MyBoolean; Assert.True(jsonElement.GetBoolean()); jsonElement = obj.MyInt; Assert.Equal(42, jsonElement.GetInt32()); jsonElement = obj.MyDateTime; Assert.Equal(MyDateTime, jsonElement.GetDateTime()); jsonElement = obj.MyGuid; Assert.Equal(MyGuid, jsonElement.GetGuid()); } void VerifyObject() { JsonElement jsonElement = obj.MyObject; // Here we access a property on a nested object and must use JsonElement (not a dynamic property). Assert.Equal("World", jsonElement.GetProperty("MyString").GetString()); } void VerifyArray() { JsonElement jsonElement = obj.MyArray; Assert.Equal(2, jsonElement.EnumerateArray().Count()); } }
public static object ConsumeJsonElement(Type targetReturnType, JsonElement e) { // ReSharper disable once HeapView.BoxingAllocation object ParseNumber(JsonElement el) { if (el.TryGetInt64(out var l)) { return(l); } return(el.GetDouble()); } return(targetReturnType switch { _ when targetReturnType == typeof(bool) => e.GetBoolean(), _ when targetReturnType == typeof(byte) => e.GetByte(), _ when targetReturnType == typeof(decimal) => e.GetDecimal(), _ when targetReturnType == typeof(double) => e.GetDouble(), _ when targetReturnType == typeof(Guid) => e.GetGuid(), _ when targetReturnType == typeof(short) => e.GetInt16(), _ when targetReturnType == typeof(int) => e.GetInt32(), _ when targetReturnType == typeof(long) => e.GetInt64(), _ when targetReturnType == typeof(float) => e.GetSingle(), _ when targetReturnType == typeof(string) => e.GetString(), _ when targetReturnType == typeof(DateTime) => e.GetDateTime(), _ when targetReturnType == typeof(DateTimeOffset) => e.GetDateTimeOffset(), _ when targetReturnType == typeof(ushort) => e.GetUInt16(), _ when targetReturnType == typeof(uint) => e.GetUInt32(), _ when targetReturnType == typeof(ulong) => e.GetUInt64(), _ when targetReturnType == typeof(sbyte) => e.GetSByte(), _ when targetReturnType == typeof(DynamicDictionary) => DynamicDictionary.Create(e), _ when targetReturnType == typeof(object) && e.ValueKind == JsonValueKind.Array => e.EnumerateArray().Select(je => ConsumeJsonElement(targetReturnType, je)).ToArray(), _ when targetReturnType == typeof(object) && e.ValueKind == JsonValueKind.Object => e.ToDictionary(), _ when targetReturnType == typeof(object) && e.ValueKind == JsonValueKind.True => true, _ when targetReturnType == typeof(object) && e.ValueKind == JsonValueKind.False => false, _ when targetReturnType == typeof(object) && e.ValueKind == JsonValueKind.Null => null, _ when targetReturnType == typeof(object) && e.ValueKind == JsonValueKind.String => e.GetString(), _ when targetReturnType == typeof(object) && e.ValueKind == JsonValueKind.Number => ParseNumber(e), _ => null });
public Guid?GetGuidValue() => _jsonNode.GetGuid();
public static object ToObject(this JsonElement element, Type type) { object result = null; var nonNullType = Nullable.GetUnderlyingType(type); if (nonNullType != null) { type = nonNullType; } switch (Type.GetTypeCode(type)) { case TypeCode.Boolean: result = element.GetBoolean(); break; case TypeCode.Byte: result = element.GetByte(); break; case TypeCode.SByte: result = element.GetSByte(); break; case TypeCode.Int16: result = element.GetInt16(); break; case TypeCode.UInt16: result = element.GetUInt16(); break; case TypeCode.Int32: result = element.GetInt32(); break; case TypeCode.UInt32: result = element.GetUInt32(); break; case TypeCode.Int64: result = element.GetInt64(); break; case TypeCode.UInt64: result = element.GetUInt64(); break; case TypeCode.Single: result = element.GetSingle(); break; case TypeCode.Double: result = element.GetDouble(); break; case TypeCode.Decimal: result = element.GetDecimal(); break; case TypeCode.DateTime: result = element.GetDateTime(); break; case TypeCode.String: result = element.GetString(); break; default: if (type == typeof(Guid)) { result = element.GetGuid(); break; } throw new NotImplementedException(); } if (nonNullType != null) { return(result.ToNullable()); } return(result); }
protected TObject GetId <TObject>(JsonElement id) => typeof(TObject) == typeof(Guid) ? (TObject)(object)id.GetGuid() : JsonSerializer.Deserialize <TObject>(id.GetRawText());
private static object WithValue(this PropertyInfo property, JsonElement value) { var propType = property.PropertyType; if (value.ValueKind == JsonValueKind.Null) { return(propType.GetDefaultValue()); } else if (typeof(bool) == propType) { return(value.GetBoolean()); } else if (typeof(int) == propType) { return(value.GetInt32()); } else if (typeof(uint) == propType) { return(value.GetUInt32()); } else if (typeof(short) == propType) { return(value.GetInt16()); } else if (typeof(ushort) == propType) { return(value.GetUInt16()); } else if (typeof(long) == propType) { return(value.GetInt64()); } else if (typeof(ulong) == propType) { return(value.GetUInt64()); } else if (typeof(string) == propType) { return(value.GetString()); } else if (typeof(byte) == propType) { return(value.GetByte()); } else if (typeof(sbyte) == propType) { return(value.GetSByte()); } else if (typeof(DateTime) == propType) { return(value.GetDateTime()); } else if (typeof(DateTimeOffset) == propType) { return(value.GetDateTimeOffset()); } else if (typeof(double) == propType) { return(value.GetDouble()); } else if (typeof(float) == propType) { return(value.GetSingle()); } else if (typeof(Guid) == propType) { return(value.GetGuid()); } else if (typeof(decimal) == propType) { return(value.GetDecimal()); } else if (value.GetType() == propType) { return(value); } else { return(value.ToObject(propType)); } }
private static object ParseValue(JsonElement jsonEl, Type type) { var valueKind = jsonEl.ValueKind; var targetType = type; var isNullable = false; var nullableType = Nullable.GetUnderlyingType(type); if (nullableType != null) { targetType = nullableType; isNullable = true; } if (targetType.IsEnum) { targetType = Enum.GetUnderlyingType(targetType); } switch (valueKind) { case JsonValueKind.Array: case JsonValueKind.Null: case JsonValueKind.Undefined: case JsonValueKind.Object: return(isNullable ? null : targetType.GetDefault()); case JsonValueKind.False: case JsonValueKind.True: return(jsonEl.GetBoolean()); case JsonValueKind.String: return(targetType == typeof(string) ? jsonEl.GetString() : targetType == typeof(DateTime) ? jsonEl.GetDateTime() : targetType == typeof(Guid) ? jsonEl.GetGuid() : targetType.GetDefault()); case JsonValueKind.Number: return(targetType == typeof(byte) ? jsonEl.GetByte() : targetType == typeof(decimal) ? jsonEl.GetDecimal() : targetType == typeof(double) ? jsonEl.GetDouble() : targetType == typeof(short) ? jsonEl.GetInt16() : targetType == typeof(int) ? jsonEl.GetInt32() : targetType == typeof(long) ? jsonEl.GetInt64() : targetType == typeof(sbyte) ? jsonEl.GetSByte() : targetType == typeof(float) ? jsonEl.GetSingle() : targetType == typeof(ushort) ? jsonEl.GetUInt16() : targetType == typeof(uint) ? jsonEl.GetUInt32() : targetType == typeof(ulong) ? jsonEl.GetUInt64() : targetType.GetDefault()); default: return(targetType.GetDefault()); } }
public static object GetValue(JsonElement jsonElement) { if (_columnDataType == typeof(DateTime)) { return(jsonElement.GetDateTime()); } else if (_columnDataType.IsEnum) { if (jsonElement.ValueKind == JsonValueKind.Number) { return(Enum.Parse(THelper.GetUnderlyingType <TValue>(), jsonElement.GetInt32().ToString())); } else { return(Enum.Parse(THelper.GetUnderlyingType <TValue>(), jsonElement.GetString())); } } else if (_columnDataType == typeof(byte)) { return(jsonElement.GetByte()); } else if (_columnDataType == typeof(decimal)) { return(jsonElement.GetDecimal()); } else if (_columnDataType == typeof(double)) { return(jsonElement.GetDouble()); } else if (_columnDataType == typeof(short)) { return(jsonElement.GetInt16()); } else if (_columnDataType == typeof(int)) { return(jsonElement.GetInt32()); } else if (_columnDataType == typeof(long)) { return(jsonElement.GetInt64()); } else if (_columnDataType == typeof(sbyte)) { return(jsonElement.GetSByte()); } else if (_columnDataType == typeof(float)) { return(jsonElement.GetSingle()); } else if (_columnDataType == typeof(ushort)) { return(jsonElement.GetUInt16()); } else if (_columnDataType == typeof(uint)) { return(jsonElement.GetUInt32()); } else if (_columnDataType == typeof(ulong)) { return(jsonElement.GetUInt64()); } else if (_columnDataType == typeof(Guid)) { return(jsonElement.GetGuid()); } else if (_columnDataType == typeof(bool)) { if (jsonElement.ValueKind == JsonValueKind.True) { return(true); } else { return(false); } } else { return(jsonElement.GetString()); } }
public override void SerializeGuid(ref Guid val) { val = currentNode.GetGuid(); }