首页 > 解决方案 > 使用 System.Text.Json 展平对象

问题描述

我有一个看起来像这样的类:

public class Resource<TState>
{
    public TState State { get; set; }
}

生成的 JSON 通常是这样的

{
    "state": { 
        "prop1": "foo", 
        "prop2": "bar" 
    }
}

但是我需要 JSON 看起来像这样:

{
    "prop1": "foo",
    "prop2": "bar"
}

我需要它来处理序列化和反序列化。有没有办法使用 System.Text.Json 来实现这一点?

标签: c#jsonsystem.text.json

解决方案


如果你不能直接序列化/反序列化 State 属性,那么你可以实现一个通用的 JsonConverter,它必须为你可能用于 TState 的每个可能的类型实例化,并将它们添加到 JsonSerializerOptions 对象。显然,只有在您知道将用于 TState 的类型时才有效。

public class Resource<TState>
{
    public TState State { get; set; }
}

public class ResourceJsonConverter<TState> : JsonConverter<Resource<TState>>
{
    public override Resource<TState> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        => new Resource<TState>()
        {
            State = JsonSerializer.Deserialize<TState>(ref reader, options)
        };


    public override void Write(Utf8JsonWriter writer, Resource<TState> value, JsonSerializerOptions options)
        => JsonSerializer.Serialize<TState>(writer, value.State, options);
}

[Fact]
public void Convert()
{
    var r = new Resource<string> { State = "test" };

    var options = new JsonSerializerOptions();
    options.Converters.Add(new ResourceJsonConverter<string>());

    JsonSerializer.Serialize(r, options).Should().Be("test");
}

推荐阅读