【发布时间】:2017-09-26 02:20:09
【问题描述】:
下面是我的 JSON:
[
{
"name": "Node-1",
"flag": true,
"myObj": {
region: {
info: {
name: null,
infoFlag: false,
}
}
},
"nodes": [
{
"name": "Node-1-1",
"flag": true,
"myObj": {
region: {
info: {
name: "abc",
infoFlag: false,
}
}
},
"nodes": [
{
"name": "Node-1-1-1",
"flag": true,
"myObj": {
region: {
info: {
name: "xyz",
infoFlag: false,
}
}
},
"nodes": [
]
}
]
}
]
}
]
我想使用以下规则更新上述 JSON 字符串的两个属性:
标志:我想将此属性盲目更新为false。
infoFlag:如果info的name属性是null,那么我想将infoFlag更新为true,否则false如果是not null。
因此,在使用这些规则更新我的 JSON 后,我希望将该 JSON 作为字符串。
注意:我不想反序列化然后根据以上两个规则更新属性,因为我的 JSON 有很多我不想为其创建类的属性,所以我寻找无需反序列化类即可工作的东西。
这就是我尝试的方式:
string json = "MyJson";
var temp = JArray.Parse(json);
temp.Descendants()
.OfType<JProperty>()
json = temp.ToString();
但是在这里我不知道如何递归地遍历我的 JSON;如您所见,我有如下递归结构:
Node-1
Node-1-1
Node-1-1-1
【问题讨论】:
-
您可以deserialize without having to declare classes。 alertnative 是根本不反序列化,但是你必须编写一个非常智能的解析器。
-
@GolezTrol 提出这个问题的主要目的是如何在不反序列化到类的情况下定位和更新属性值。我非常清楚如何将 json 字符串反序列化为动态对象 :)
-
那你为什么说“有很多我不想为其创建类的属性”。使用动态对象,您可以做到这一点。 JArray.Parse 你也反序列化。如果你想替换属性而不反序列化,你将不得不坚持
String.Replace或一些正则表达式魔法,但我敢肯定你不想走那条路。 -
@GolezTrol 可以反序列化到任何动态对象,但我只是说我不想反序列化到任何类,因为我不想创建类来处理这个反序列化。此外,我我正在努力在反序列化为动态对象后操纵这些属性。