c# - 使用 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 来实现这一点?
解决方案
如果你不能直接序列化/反序列化 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");
}
推荐阅读
- azure-devops - 无法在 Azure DevOps yml 管道中解析 $(Release.ReleaseId)
- python - 如何为导入的模块配置日志记录?
- arrays - 如何将 json 字符串转换为 bash 中的单个字符数组?
- apache-spark - 使用 SparklyR 连接到 Spark 时出错
- regex - 如何使用正则表达式在回车和换行之前附加字符
- r - tidyverse 中是否有 R 函数可以使用代码选择列的元素?
- python - 如何使用 OpenCV 对 IP 摄像机进行身份验证
- angular - 如何构建我的 Angular 8 应用程序,以便在浏览器中打开 index.html 时它可以工作?
- c# - 在 Unity3D 中模拟真实的汽车旋转
- html - 在我的 CSS 中,网格属性无法正常运行