繁体   English   中英

将 Json 反序列化为字典<string, object>其中 object 是本机值类型</string,>

[英]Deserialise Json to Dictionary<string, object> where object is native value type

我正在尝试反序列化Dictionary<string,object> ,但反序列化器返回Dictionary<string, JsonElement>

    [Fact]
    public void MyTestMethod()
    {
        // Arrange

        var input = @"
        {
            ""Key1"":""Value1"",
            ""Key2"":true
        }";

        // Act
        var obj = JsonSerializer.Deserialize<Dictionary<string, object>>(input)!;

        // Assert
        Assert.Equal(typeof(string), obj["Key1"].GetType());
        Assert.Equal(typeof(bool), obj["Key2"].GetType());
    }

如何反序列化为原生值? (我知道字典永远不会有复杂的子对象)。

为此,您需要使用自定义转换器。 像这样的东西会起作用:

public class ObjectNativeTypeConverter : JsonConverter<object>
{
    public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, 
        JsonSerializerOptions options) => reader.TokenType switch
        {
            JsonTokenType.True => true,
            JsonTokenType.False => false,
            JsonTokenType.Number when reader.TryGetInt64(out long l) => l,
            JsonTokenType.Number => reader.GetDouble(),
            JsonTokenType.String when reader.TryGetDateTime(out DateTime datetime) => datetime,
            JsonTokenType.String => reader.GetString()!,
            _ => JsonDocument.ParseValue(ref reader).RootElement.Clone()
        };
    }

    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
    {
        // An exercise for you if you need it
        throw new NotImplementedException();
    }
}

(注意:这几乎是从官方文档中逐字记录的)

并像这样使用它:

var options = new JsonSerializerOptions();
options.Converters.Add(new ObjectNativeTypeConverter());

var obj = JsonSerializer.Deserialize<Dictionary<string, object>>(input, options);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM