如何反转Newtonsoft JsonConvert PopulateObject

问题描述 投票:2回答:1

如何区分对象的2个版本的2个Json表示形式,以便可以将输出提供给JsonConvert.PopulateObject(...)以将对象的第一个版本转换为第二个版本。例如:

public class Dog
{
  public string Name { get; set; }
  public int Age { get; set; }
}

var myDog = new Dog { Name = "Dio", Age = 1 };

var before = JsonConvert.SerializeObject(myDog); // { "Name": "Dio", "Age" : 1 }

myDog.Age++;

var after = JsonConvert.SerializeObject(myDog);   // { "Name": "Dio", "Age" : 2 }

// How do I generate this variable, so that I can use it with PopulateObject?
var ageIncrementJson = "{ \"Age\" : 2 }";

myDog = new Dog { Name = "Dio", Age = 1 };

JsonConvert.PopulateObject(ageIncrementJson, myDog);

// myDog should now have an age of 2

[我已经尝试过使用JsonDiffPatch,但是会产生前后文件,但Newtonsoft不接受(例如{“ Age”:[“ 1”,“ 2”]}

c# json.net event-sourcing
1个回答
0
投票
public class Dog { public string Name { get; set; } public int Age { get; set; } } public static void Test() { var myDog = new Dog { Name = "Dio", Age = 1 }; var before = JsonConvert.SerializeObject(myDog); // { "Name": "Dio", "Age" : 1 } myDog.Age++; var after = JsonConvert.SerializeObject(myDog); // { "Name": "Dio", "Age" : 2 } // How do I generate this variable, so that I can use it with PopulateObject? var ageIncrementJson = "{ \"Age\" : 2 }"; var diffJson = GetDiffJson(JsonConvert.DeserializeObject<Dog>(before) , JsonConvert.DeserializeObject<Dog>(after)); myDog = new Dog { Name = "Dio", Age = 1 }; JsonConvert.PopulateObject(ageIncrementJson, myDog); // myDog should now have an age of 2 } private static string GetDiffJson(Dog d1, Dog newDog) { var dic = new Dictionary<string, object>(); // alternatively use reflection, for each property... if (d1.Age != newDog.Age) dic[nameof(d1.Age)] = newDog.Age; if (d1.Name != newDog.Name) dic[nameof(d1.Name)] = newDog.Name; return JsonConvert.SerializeObject(dic); }
© www.soinside.com 2019 - 2024. All rights reserved.