コード例 #1
0
        protected override void WriteObjectProperties(JsonWriter writer, Expression instance, IReadOnlyCollection <Property> properties, JsonSerializer serializer)
        {
            if (instance is ConstantExpression constantExpression)
            {
                writer.CheckNotNull(nameof(writer)).WritePropertyName(nameof(ConstantExpression.Type));
                serializer.CheckNotNull(nameof(serializer)).Serialize(writer, constantExpression.Type);

                var type = constantExpression.Type?.ToType();
                if (constantExpression.Value is not null)
                {
                    var valueType = constantExpression.Value.GetType();
                    if (valueType != type)
                    {
                        type = valueType;
                        writer.WritePropertyName(ValueTypePropertyName);
                        serializer.Serialize(writer, type.AsTypeInfo());
                    }
                }

                writer.WritePropertyName(nameof(ConstantExpression.Value));
                serializer.Serialize(writer, constantExpression.Value, type);
            }
            else
            {
                base.WriteObjectProperties(writer, instance, properties, serializer);
            }
        }
コード例 #2
0
        protected override void WriteObjectProperties(JsonWriter writer, VariableQueryArgumentList instance, IReadOnlyCollection <Property> properties, JsonSerializer serializer)
        {
            writer.CheckNotNull(nameof(writer)).WritePropertyName(nameof(VariableQueryArgumentList.ElementType));
            serializer.CheckNotNull(nameof(serializer)).Serialize(writer, instance.CheckNotNull(nameof(instance)).ElementType);

            writer.WritePropertyName(nameof(VariableQueryArgumentList.Values));
            serializer.Serialize(writer, instance.Values, instance.ElementType?.Type);
        }
コード例 #3
0
        public virtual T?ReadJson(JsonReader reader, Type objectType, T?existingValue, JsonSerializer serializer)
        {
            reader.CheckNotNull(nameof(reader));
            objectType.CheckNotNull(nameof(objectType));
            serializer.CheckNotNull(nameof(serializer));

            if (reader.TokenType == JsonToken.Null)
            {
                return(default);
コード例 #4
0
ファイル: TypeInfoConveter.cs プロジェクト: lanicon/aqua-core
        public override TypeInfo?ReadJson(JsonReader reader, Type objectType, TypeInfo?existingValue, JsonSerializer serializer)
        {
            reader.CheckNotNull(nameof(reader));
            serializer.CheckNotNull(nameof(serializer));

            if (reader.TokenType == JsonToken.String &&
                reader.Value is string typeKey &&
                KnownTypesRegistry.TryGetTypeInfo(typeKey, out var typeInfo))
            {
                return(typeInfo);
            }

            return(base.ReadJson(reader, objectType, existingValue, serializer));
        }
コード例 #5
0
        protected override void ReadObjectProperties(JsonReader reader, DynamicObject result, Dictionary <string, Property> properties, JsonSerializer serializer)
        {
            reader.CheckNotNull(nameof(reader)).Advance();
            result.CheckNotNull(nameof(result));
            serializer.CheckNotNull(nameof(serializer));

            TypeInfo?typeInfo = null;

            void SetResult(IEnumerable <DynamicProperty>?properties = null)
            {
                reader.AssertEndObject();

                result.Type = typeInfo;
                if (properties?.Any() is true)
                {
                    result.Properties = new PropertySet(properties);
                }
            }

            if (reader.IsProperty(nameof(DynamicObject.Type)))
            {
                typeInfo = reader.Read <TypeInfo?>(serializer);
                reader.Advance();
            }

            bool IsProperty(string property, out bool isDynamicValueType)
            {
                isDynamicValueType = false;

                if (reader.IsProperty(property))
                {
                    return(true);
                }

                if (reader.IsProperty($"Dynamic{property}"))
                {
                    isDynamicValueType = true;
                    return(true);
                }

                return(false);
            }

            if (IsProperty(ValueProperty, out var isDynamicValue))
            {
                var value = isDynamicValue
                    ? reader.Read <DynamicObject>(serializer)
                    : reader.Read(typeInfo, serializer);
                SetResult(new[] { new DynamicProperty(string.Empty, value) });
                return;
            }

            if (IsProperty(ValuesProperty, out isDynamicValue))
            {
                reader.Advance();
                if (reader.TokenType == JsonToken.Null)
                {
                    SetResult();
                    return;
                }

                if (reader.TokenType != JsonToken.StartArray)
                {
                    throw reader.CreateException($"Expected array");
                }

                var elementType = TypeHelper.GetElementType(typeInfo?.ToType()) ?? typeof(object);
                bool TryReadNextItem(out object?value)
                {
                    var itemType = isDynamicValue ? typeof(DynamicObject) : elementType;

                    if (!reader.TryRead(itemType, serializer, out value))
                    {
                        if (reader.TokenType == JsonToken.EndArray)
                        {
                            return(false);
                        }

                        throw reader.CreateException("Unexpected token structure.");
                    }

                    return(true);
                }

                var values = new List <object?>();
                while (TryReadNextItem(out var item))
                {
                    values.Add(item);
                }

                if (isDynamicValue)
                {
                    elementType = typeof(object);
                }
                else if (values.Any(x => x is not null && (elementType == typeof(object) || !elementType.IsInstanceOfType(x))) &&
                         values.All(x => x is null || x is string))
                {
                    elementType = typeof(string);
                }

                var valueArray = values.CastCollectionToArrayOfType(elementType);
                SetResult(new[] { new DynamicProperty(string.Empty, valueArray) });
                return;
            }

            if (reader.IsProperty(nameof(DynamicObject.Properties)))
            {
                reader.Advance();
                if (reader.TokenType == JsonToken.Null)
                {
                    SetResult();
                    return;
                }

                if (reader.TokenType != JsonToken.StartArray)
                {
                    throw reader.CreateException("Expected array");
                }

                var propertySet = new List <DynamicProperty>();

                bool NextItem()
                {
                    reader.Advance();
                    return(reader.TokenType != JsonToken.EndArray);
                }

                while (NextItem())
                {
                    reader.AssertStartObject(false);

                    reader.AssertProperty(nameof(DynamicProperty.Name));
                    var name = reader.ReadAsString() ?? throw reader.CreateException("Property name must not be null");

                    reader.AssertProperty(nameof(Type));
                    var type = reader.Read <TypeInfo?>(serializer);

                    reader.AssertProperty(nameof(DynamicProperty.Value));
                    var value = reader.Read(type, serializer);

                    reader.AssertEndObject();
                    propertySet.Add(new DynamicProperty(name, value));
                }

                SetResult(propertySet);
                return;
            }

            throw reader.CreateException($"Unexpected token {reader.TokenType}");
        }
コード例 #6
0
        protected override void WriteObjectProperties(JsonWriter writer, DynamicObject instance, IReadOnlyCollection <Property> properties, JsonSerializer serializer)
        {
            writer.CheckNotNull(nameof(writer));
            serializer.CheckNotNull(nameof(serializer));
            var instanceType      = instance.CheckNotNull(nameof(instance)).Type;
            var dynamicProperties = instance.Properties;

            if (TryGetWrappedValue(dynamicProperties, out var value))
            {
                var type = instanceType ?? CreateTypeInfo(value);

                writer.WritePropertyName(nameof(DynamicObject.Type));
                serializer.Serialize(writer, type);

                var propertyName   = type.IsCollection() ? ValuesProperty : ValueProperty;
                var isDynamicValue =
                    value is DynamicObject ||
                    (value is object[] objectArray && objectArray.Any(x => x is DynamicObject));
                if (isDynamicValue)
                {
                    propertyName = $"Dynamic{propertyName}";
                }

                writer.WritePropertyName(propertyName);
                serializer.Serialize(writer, value, type?.ToType());
            }
            else
            {
                if (instanceType is not null)
                {
                    writer.WritePropertyName(nameof(DynamicObject.Type));
                    serializer.Serialize(writer, instanceType);
                }

                if (dynamicProperties?.Any() is true)
                {
                    writer.WritePropertyName(nameof(DynamicObject.Properties));

                    writer.WriteStartArray();
                    foreach (var property in dynamicProperties)
                    {
                        writer.WriteStartObject();

                        writer.WritePropertyName(nameof(DynamicProperty.Name));
                        writer.WriteValue(property.Name);

                        writer.WritePropertyName(nameof(Type));
                        serializer.Serialize(writer, CreateTypeInfo(property.Value));

                        writer.WritePropertyName(nameof(DynamicProperty.Value));
                        if (property.Value is null)
                        {
                            writer.WriteNull();
                        }
                        else
                        {
                            serializer.Serialize(writer, property.Value);
                        }

                        writer.WriteEndObject();
                    }

                    writer.WriteEndArray();
                }
            }
        }
コード例 #7
0
 public override void WriteJson(JsonWriter writer, object?value, JsonSerializer serializer)
 {
     serializer.CheckNotNull(nameof(serializer));
     serializer.Serialize(writer, value);
 }