Exemplo n.º 1
0
    public override DimensionCodec?Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType != JsonTokenType.StartObject)
        {
            throw new JsonException($"Expected StartObject got: {reader.TokenType}");
        }

        var dimensionCodec = new DimensionCodec();

        var props = typeToConvert.GetProperties();

        while (reader.Read())
        {
            if (reader.TokenType == JsonTokenType.EndObject)
            {
                return(dimensionCodec);
            }

            if (reader.TokenType != JsonTokenType.PropertyName)
            {
                throw new JsonException($"Expected property name got: {reader.TokenType}");
            }

            var propName = reader.GetString();

            reader.Read();

            if (string.IsNullOrWhiteSpace(propName))
            {
                throw new JsonException("Property name was null.");
            }

            foreach (var(name, property) in this.propertyMap)
            {
                var convertedName = options.PropertyNamingPolicy?.ConvertName(name) ?? name;

                if (!propName.Equals(convertedName, StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                if (!ConverterHelpers.TryGetAction(property.PropertyType, out var action))
                {
                    dimensionCodec.Element = JsonSerializer.Deserialize <DimensionElement>(ref reader, options);
                    continue;
                }

                action.Invoke(dimensionCodec, ref reader, property);
            }
        }

        throw new JsonException($"Expected EndObject got: {reader.TokenType}");
    }