解析任何结构(第n个深度)的json的通用方法C#

时间:2019-03-01 22:48:34

标签: c# json json.net

必须编写一个通用方法,该方法将采用任何结构的json并向具有数据的每个元素添加新属性

1号结构,(人)

输入Json数据,

 {'name':'sam', 'age': 12}

预期的输出

{'name':'sam', 'name_xyz': 'Rob', 'age': 12, 'age_xyz': 15}

2号结构,(带地址的人)

输入json数据,

{ 'name': 'sam', address : { 'city': 'fishers', 'zip': 23456 } }

预期的输出

{'name': 'sam', 'name_xyz': 'rob', address : { 'city': 'fishers', 'city_xyz': 'fishers', 'zip': 23456, 'zip_xyz': 678768} }

3号结构(人员)

输入json数据,

[{'name': 'sam'}, {'name':'rex'}]

预期输出,

[{'name': 'sam', 'name_xyz': 'felix'}, {'name':'rex', 'name_xyz' : 'bob'}]

我有一些使用NewtonSoft进行定义的模型的东西,但是我需要通用的方法来解析和评估任何类型的json数据。

var jsonData = JsonConvert.SerializeObject(modelData);
var jArray = JArray.Parse(jsonData) as JArray;
dynamic persons = jArray;
foreach (dynamic person in persons)
{
 var name = person.name;
 var newname = Getnewname(name);
 person.Add(new JProperty("name_xyz", newname));

 var age = person.age;
 var newage = GetnewAge(age);
 person.Add(new JProperty("age_xyz", newage));
}
var result = persons.ToString();

要考虑的事情,

  1. 寻找每个节点,确定它是数组还是对象
  2. 找到的对象,使用相同的属性在相同级别创建新对象,后缀为'_xyz'
  3. 找到数组,遍历每个对象并执行第2步
  4. 这将是第n级深度

1 个答案:

答案 0 :(得分:0)

我遇到了类似的情况,我使用“ 嵌套字典”方法解决了该问题。在强类型实体的舒适区工作总是很高兴,但是有时候创建 C#类可能会变得很麻烦。这就是我的情况。

像字典一样处理整个JSON,其中一个或多个键可能存储另一个Dictionary。而且这可能会持续几个层次。 Jobject.Parse 方法对我有用。 JObject 的作用类似于键值集合,并且随着遍历的深入,您可以递归地检索更多的 JObject 实例。

Newtonsoft参考-平面词典 https://www.newtonsoft.com/json/help/html/SerializingCollections.htm

这不适用于像您这样的嵌套结构。

Newtonsoft代码段-解析为JObject

string json="[{'name': 'sam', 'name_xyz': 'felix'}, {'name':'rex', 'name_xyz' : 'bob'}]"
JObject o = JObject.Parse(json);

https://www.newtonsoft.com/json/help/html/ParseJsonObject.htm

Newtonsoft参考-JObject https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JObject.htm

有关使用JObject而不是硬输入的更多示例

https://www.newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm