在System.Text.Json中是否可能找到未映射的属性?

3

有没有可能用 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);

1个回答

7
你可以使用 [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的评论)。

请参阅如何使用System.Text.Json处理溢出JSON以了解更多信息。

要查找所有未映射的属性,您需要向所有要序列化的类添加带有[JsonExtensionData]的属性。此外,您需要对其进行循环操作(也许使用反射)。这有点冗长,但它有效。


1
它也可以在 .Net Framework 中通过 System.Text.Json 5.0.2 包使用。 - Jimi
1
很棒的添加,Jimi :) - Julian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接