是否可以在 System.Text.Json 中找到未映射的属性?
Posted
技术标签:
【中文标题】是否可以在 System.Text.Json 中找到未映射的属性?【英文标题】:Is it possible to find unmapped properties in System.Text.Json? 【发布时间】:2021-08-23 19:14:38 【问题描述】:是否可以使用System.Text.Json.JsonSerializer
找到未映射的属性?
我正在访问一个返回文档数组的 API。我想知道是否有办法知道 json 文档中是否有我的 C# 类型未映射的属性。充其量是一个返回未映射属性列表的方法。
示例
JSON 文档
"docs": [
"foo": "a",
"bar": "b",
"baz": "c",
]
C# 类型
public class Wrapper
[JsonPropertyName("docs")]
public List<MyDocument> Documents get; set;
public class MyDocument
[JsonPropertyName("foo")]
public string Foo get; set;
[JsonPropertyName("baz")]
public string Baz get; set;
解析器
using System.Text.Json;
var body = " ... ";
var documents = JsonSerializer.Deserialize<Documents>(body);
List<JsonElement> unmappedProperties
= JsonSerializer.FindUnmappedProperties<Document>(body);
【问题讨论】:
看起来像 Is it possible to catch somehow the remainder of JSON data that didn't match any POCO properties while deserializing? 的副本,同意吗? 【参考方案1】:您可以使用[JsonExtensionData]
,例如:
public class MyDocument
[JsonPropertyName("foo")]
public string Foo get; set;
[JsonPropertyName("baz")]
public string Baz get; set;
[JsonExtensionData]
public Dictionary<string, object> ExtensionData get; set;
属性“bar”将被序列化为ExtensionData
属性。
您需要 .NET Core 3+ 或 .NET 5+(或 .NET framework 4.6.1 / NET Standard 2.0,请参阅 Jimi 的评论)
见How to handle overflow JSON with System.Text.Json
要查找所有未映射的属性,您需要将带有[JsonExtensionData]
的属性添加到所有要序列化的类中。你也需要循环它(也许用反射)。虽然有点麻烦,但是很管用。
【讨论】:
它也可以在带有System.Text.Json 5.0.2 包的.Net Framework 中使用。 伟大的补充 Jimi :)以上是关于是否可以在 System.Text.Json 中找到未映射的属性?的主要内容,如果未能解决你的问题,请参考以下文章
是否有 System.Text.Json 替代 Json.NET 的 JsonProperty(Order)?
System.Text.Json 中是不是可以进行多态反序列化?
将 Newtonsoft.Json 代码迁移到 System.Text.Json