我有一些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做到这一点?
答案 0 :(得分:5)
您可以使用Json.Net""扩展数据"处理此问题的功能。
向您的班级添加新的Dictionary<string, object>
媒体资源,并使用[JsonExtensionData]
属性对其进行标记。 (如果您不想影响类的公共接口,可以将其设为私有属性。)在反序列化时,此字典将填充与任何其他公共属性不匹配的任何数据。你的班级在序列化时,字典中的数据将作为对象的属性写回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"
}
答案 1 :(得分:0)
好的,所以在发布问题之后,去吃午餐,回来后我找到了解决方案。我没有使用JSON.nets“扩展数据”,而是发现它们具有“合并”功能 http://james.newtonking.com/archive/2014/08/04/json-net-6-0-release-4-json-merge-dependency-injection
IMO我认为这更清洁,并决定采用这种方法。
以下是我正在撰写的样本
public class Cell
{
public string Text { get; set; }
public int ID { get; set; }
public CellStyle Style { get; set; }
}
public class CellStyle
{
public string BgColor { get; set; }
public string TextColor { get; set; }
}
string json = @"{
'Text': 'My Cell',
'ID': 20,
'TsID': 100,
'Style': {
'BgColor' : 'Red',
'TextColor' : 'Black',
'Caption' : 'Help My Cell',
}
}";
var orgCell = JsonConvert.DeserializeObject<Cell>(json);
orgCell.Style.TextColor = "White";
orgCell.Style.BgColor = "Blue";
var obj = JsonConvert.SerializeObject(orgCell);
JObject o1 = JObject.Parse(json);
JObject o2 = JObject.Parse(obj);
o1.Merge(o2, new JsonMergeSettings
{
// union array values together to avoid duplicates
MergeArrayHandling = MergeArrayHandling.Union
});
o1.ToString(); // gives me the intended string