c# - 反序列化 JSON 对象的一部分并将其序列化回来,其余属性保持不变

标签 c# json.net

我有一些 JSON,我想将其反序列化为 C# 类的实例。但是,该类并不具有与原始 JSON 匹配的所有字段/属性。我希望能够修改类中的属性值,然后将其序列化回 JSON,并且原始 JSON 中的剩余字段和属性仍然完好无损。

例如,假设我有以下 JSON:

{
    "name": "david",
    "age": 100,
    "sex": "M",
    "address": "far far away"
}

我想将它反序列化到这个类中:

class MyClass 
{  
    public string name { get; set; }  
    public int age { get; set; }  
}

反序列化后,我设置以下内容:

myClass.name = "John";
myClass.age = 200;

现在,我想将其序列化回 JSON 并得到以下结果:

{
    "name": "John",
    "age": 200,
    "sex": "M",
    "address": "far far away"
}

有没有办法使用 Json.Net 来做到这一点?

最佳答案

您可以使用 Json.Net 的“扩展数据”功能来处理此问题。

添加新的Dictionary<string, object>属性到您的类(class)并用 [JsonExtensionData] 标记它属性。 (如果您不想影响类的公共(public)接口(interface),则可以将其设为私有(private)属性。)反序列化时,此字典将填充与类的任何其他公共(public)属性不匹配的任何数据。序列化时,字典中的数据将作为对象的属性写回 JSON。

class MyClass
{
    public string name { get; set; }
    public int age { get; set; }

    [JsonExtensionData]
    private Dictionary<string, object> otherStuff { get; set; }
}

这是一个演示:

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {  
            ""name"": ""david"",
            ""age"": 100,
            ""sex"": ""M"",
            ""address"": ""far far away""
        }";

        MyClass obj = JsonConvert.DeserializeObject<MyClass>(json);

        Console.WriteLine("orig name: " + obj.name);
        Console.WriteLine("orig age: " + obj.age);
        Console.WriteLine();

        obj.name = "john";
        obj.age = 200;

        json = JsonConvert.SerializeObject(obj, Formatting.Indented);
        Console.WriteLine(json);
    }
}

输出:

orig name: david
orig age: 100

{
  "name": "john",
  "age": 200,
  "sex": "M",
  "address": "far far away"
}

关于c# - 反序列化 JSON 对象的一部分并将其序列化回来,其余属性保持不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26937606/

相关文章:

c# - 在 C# 中监听另一个窗口调整大小事件

c# - 如何在 MVC 4 中使用 Split() 方法运行 Distinct() 方法?

c# - WinForms 属性网格不允许我更改结构值

c# - 使 NSwag 生成的客户端中的属性可为空

c# - NewtonSoft JsonConverter - 访问其他属性

c# - 使用 WebAPI 2 进行 JSON.NET 抽象/派生类反序列化

c# - 使用 Newtonsoft Json.NET 解析多维 JSON 数组

c# - SystemEvents.TimeChanged 触发两次

c# - 从 JSON 字符串中获取特定值

c# - 无法更新 MSI 安装的 Windows 服务