示例#1
0
        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
            });
示例#3
0
 public Guid?GetGuidValue() => _jsonNode.GetGuid();
示例#4
0
        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);
        }
示例#5
0
 protected TObject GetId <TObject>(JsonElement id) =>
 typeof(TObject) == typeof(Guid) ? (TObject)(object)id.GetGuid() : JsonSerializer.Deserialize <TObject>(id.GetRawText());
示例#6
0
        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));
            }
        }
示例#7
0
        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());
     }
 }
示例#9
0
 public override void SerializeGuid(ref Guid val)
 {
     val = currentNode.GetGuid();
 }