Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析任意结构(第n个深度)的json的通用方法c#_C#_Json_Json.net - Fatal编程技术网

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

解析任意结构(第n个深度)的json的通用方法c#,c#,json,json.net,C#,Json,Json.net,必须编写一个通用方法,该方法将接受任何结构的json,并向每个包含数据的元素添加新属性 结构#1(人) 输入Json数据 {'name':'sam', 'age': 12} 预期产量 {'name':'sam', 'name_xyz': 'Rob', 'age': 12, 'age_xyz': 15} {'name': 'sam', 'name_xyz': 'rob', address : { 'city': 'fishers', 'city_xyz': 'fishers', 'zip':

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

结构#1(人)

输入Json数据

 {'name':'sam', 'age': 12}
预期产量

{'name':'sam', 'name_xyz': 'Rob', 'age': 12, 'age_xyz': 15}
{'name': 'sam', 'name_xyz': 'rob', address : { 'city': 'fishers', 'city_xyz': 'fishers', 'zip': 23456, 'zip_xyz': 678768} }
结构#2,(有地址的人)

输入json数据

{ 'name': 'sam', address : { 'city': 'fishers', 'zip': 23456 } }
[{'name': 'sam'}, {'name':'rex'}]
预期产量

{'name':'sam', 'name_xyz': 'Rob', 'age': 12, 'age_xyz': 15}
{'name': 'sam', 'name_xyz': 'rob', address : { 'city': 'fishers', 'city_xyz': 'fishers', 'zip': 23456, 'zip_xyz': 678768} }
结构#3(个人的)

输入json数据

{ 'name': 'sam', address : { 'city': 'fishers', 'zip': 23456 } }
[{'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();
<>要考虑的事情,

  • 查找每个节点,确定它是数组还是对象
  • 找到对象,在同一级别创建具有相同属性的新对象后修复程序“\u xyz”
  • 找到数组,循环遍历每个对象和相同的步骤2
  • 它将是第n层深度

  • 我遇到过类似的情况,我用“嵌套字典”的方法解决了它。虽然在强类型实体的舒适区工作总是一件令人愉快的事情,但有时创建C类可能会变得太麻烦。这就是我的处境

    将整个JSON视为一个字典,其中一个或多个键可能存储另一个字典。这可能会持续几个层次。方法Jobject.Parse对我有效。JObject的工作方式类似于键值集合,您可以在深入遍历时递归地检索更多JObject实例

    Newtonsoft参考-平面字典

    对于像您这样的嵌套结构,这将不能很好地工作

    Newtonsoft代码片段-作为作业对象进行解析

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

    Newtonsoft参考-JObject

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


    我不清楚这篇文章中的问题是什么。想要阅读任何类型/结构的json,然后使用命名约定“existingproperty_xyz”将新属性添加到每个现有属性中,并使用结构中的新值#2预期输出,看起来您并没有在考虑中所述的同一级别创建新对象#2。更像是替换它或只是遍历它并添加更多属性。除此之外,您可以使用一些递归方法来实现这一点。是的,请不要更正新对象,只需遍历到并添加更多新属性。我正在寻找那个递归函数。@alans正确的方法是遍历并添加更多属性。