我可以反序列化为一个类并将额外的 JSON 属性放入该类上的 JObject 中吗?

本文关键字:JSON 属性 中吗 JObject 反序列化 一个 我可以 | 更新日期: 2023-09-27 18:32:43

假设我们有以下JSON:

{ 
    "a": 10,
    "b": "foo",
    "c": 30,
    "d": "bar",
}

和 C# 类:

class Stuff 
{
    public int A { get; set; }
    public string B { get; set; }
    public JObject Others { get; set; }
}

有没有一种简单的方法可以使上述 JSON 的反序列化填充成员A并使用 ab 的值B,并将 cd 的值作为 JProperties 放入 Others JObject 中?

我可以反序列化为一个类并将额外的 JSON 属性放入该类上的 JObject 中吗?

是的,您可以使用 Json.Net 的"扩展数据"功能轻松完成此操作。 您只需要使用 [JsonExtensionData] 属性标记您的 Others 属性,它应该按照您想要的方式工作。

class Stuff 
{
    public int A { get; set; }
    public string B { get; set; }
    [JsonExtensionData]
    public JObject Others { get; set; }
}

演示:

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        { 
            ""a"": 10,
            ""b"": ""foo"",
            ""c"": 30,
            ""d"": ""bar"",
        }";
        var stuff = JsonConvert.DeserializeObject<Stuff>(json);
        Console.WriteLine(stuff.A);
        Console.WriteLine(stuff.B);
        Console.WriteLine(stuff.Others["c"]);
        Console.WriteLine(stuff.Others["d"]);
    }
}

输出:

10
foo
30
bar

小提琴:https://dotnetfiddle.net/6UVvFI

你需要为此实现一个JsonConverter。它在自定义反序列化方面提供了充分的灵活性。

实现 ReadJson 方法以使用 JsonReader 遍历输入 JSON,并将其值映射到相应的目标属性。

有关完整示例,请参阅此处。