是否可以在 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

System.Text.Json API 有类似 IContractResolver 的东西

(de) 使用 System.Text.Json 序列化流

System.Text.Json 自定义Converter实现时间转换