簡體   English   中英

使用 System.Text.Json 展平 object

[英]Flatten an object with System.Text.Json

我有一個看起來像這樣的 class:

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

生成的 JSON 通常是這樣的

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

但是我需要 JSON 看起來像這樣:

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

我需要它來處理序列化和反序列化。 有沒有辦法使用 System.Text.Json 來實現這一點?

我認為這可以工作:

string jsonString = JsonSerializer.Serialize(a.State);
var state = JsonSerializer.Deserialize<TState>(jsonString);
var b = new Resource<TState>
{
   State = state
};

如果你不能直接序列化/反序列化 State 屬性,那么你可以實現一個通用的 JsonConverter,它必須為你可能用於 TState 的每個可能的類型實例化,並將它們添加到 JsonSerializerOptions object。 顯然,只有在您知道將用於 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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM