从json字符串中获取数据,并通过导航路径将子节点传递到第一层



你好,我有这个例子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。

可以使用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}";

似乎没有办法解决这个O(n)问题。我将使用Newtonsoft的JObject.Parse(string)函数来获得一个枚举树,您可以在递归循环中迭代.Children()

作为JToken的每个元素都有一个属性Path,这是您在新的JSON对象中寻找的点符号键。为了获得O(n)性能,您可以随时构造一个新文档,但是更简单的方法是使用递归构造一个键值对的平面列表,并简单地从新列表构建迭代后的文档(这会给您O(n) x2)。

由于json的嵌套特性,改变现有文档,虽然可能,但很可能比它的价值更多的工作。

您将不得不处理根JObject和每个嵌套标记之间的差异,并且您必须弄清楚您想要对数组做什么,但这应该会让您获得大部分的方法。

最新更新