.net 从json字符串中取数据,并将子节点传递到带有导航路径的第一级

0pizxfdo  于 2022-12-01  发布在  .NET
关注(0)|答案(2)|浏览(150)

你好我有这个例子json字符串:

{
   "property1":"value1",
   "property2":"value2",
   "anotherObject":{
      "property1":"anothervalue1",
      "property2":"anothervalue2",
      "anotherOfAnother":{
         "property1":"value1"
      }
   }
}

我需要把所有其他的json对象都放进去,然后传递到第一层,保留导航路径。所以示例Json变成:

{
   "property1":"value1",
   "property2":"value2",
   "anotherObject.property1":"anothervalue1",
   "anotherObject.property2":"anothervalue2",
   "anotherObject.anotherOfAnother.Property1":"value1"
}

我怎么能做到呢?我在.Net 6上提前谢谢
我被卡住了,我还没有尝试过任何东西。我正在寻找关于使用JObject或JsonConvert来达到目标的有效方法的想法。

jv4diomz

jv4diomz1#

可以使用Path属性

var jsonObject = JObject.Parse(json);

    var result = jsonObject.Descendants()
        .Where(t => !t.HasValues)
        .Select(t => "\"" + t.Path + "\"" + " : " + "\"" + t.ToString() + "\",")
        .ToArray();

    //cut off the last ","
    result[result.Length - 1] = result[result.Length - 1]
                                  .Substring(0, result[result.Length - 1].Length - 1);

    json = "{\n" + string.Join("\n", result) + "\n}";
xghobddn

xghobddn2#

这是一个复杂度为O(n)的问题,我会使用Newtonsoft'sJObject.Parse(string)函数来得到一个可枚举的树,你可以在递归循环中遍历.Children()
每个JToken元素都有一个属性Path,它是您在新JSON对象中要寻找的点标记键。为了获得O(n)的性能,您可以在运行时构造一个新文档,但使用递归来构造一个键值对的平面列表,并简单地从新列表中构建迭代后的文档可能会更容易(这给您带来了O(n)x2)。
由于json的嵌套特性,修改现有文档虽然可能,但很可能是多余的工作。
您将不得不处理根JObject和每个嵌套标记之间的差异,并且必须弄清楚您希望对数组做什么,但这应该可以让您完成大部分工作。

相关问题