[英]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.