JSON 文件在将新对象附加到数组后显示额外的反斜杠
JSON file shows extra backslashes after appending a new object to an array
我有一个具有这种结构的 school.json 文件:
{
"schoolConfig": [
{
"schoolTypeCode": "C1",
"schools": [
{
"schoolId": 456,
"config": [
{
"name": "Classes",
"value": [
{
"id": 1
},
{
"id": 2
}
]
}
]
},
{
"schoolId": 123,
"config": [
{
"name": "Classes",
"value": [
{
"id": 11
}
]
}
]
}
]
},
{
"schoolTypeCode": "C2",
"schools": [
{
"schoolId":50,
"config": [
{
"name": "Classes",
"value": [
{
"id": 12
}
]
}
]
},
{
"schoolId": 10,
"config": [
{
"name": "Classes",
"value": [
{
"id": 10
}
]
}
]
}
]
}
]
}
我想附加到 JSON 文件,该文件将更改任何过滤结果的配置值。因此,例如,输出 JSON 将具有:
"value": [
{
"id": 1
},
{
"id": 2
}
{
"id": 5
}
]
为用新的 json 替换现有的 json 而编写的 c# 代码是:
string json = File.ReadAllText(jsonFilePath);
dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
JToken classes = jsonObj.SelectToken("$.schoolConfig[?(@.schoolTypeCode == 'C1')].schools[?(@.schoolId == 456)].config[?(@.name == 'Classes')]");
List<JToken> appList = classes["value"].ToList();
var itemToAdd = new JObject();
itemToAdd["id"] = 5;
appList.Add(itemToAdd);
classes["value"] = Newtonsoft.Json.JsonConvert.SerializeObject(appList).ToString();
string output = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj, Newtonsoft.Json.Formatting.Indented);
File.WriteAllText(jsonFilePath, output);
文件被修改,除了值显示在一行中(没有缩进或格式)为
"value": "[{\"id\":1},{\"id\":2},{\"id\":5}]"
如何确保 JSON 文件不会在引号前显示额外的反斜杠,并以正确的格式呈现,如上所述。请指教
问题是您从 classes
对象中提取 value
数组作为 List<JToken>
而不是 JArray
。然后将列表序列化为字符串,然后再将其添加回 classes
。如果只是将其转换为JArray
而不是将其转换为List<JToken>
,则可以直接修改JArray
。
更改此行:
List<JToken> appList = classes["value"].ToList();
对此:
JArray appList = (JArray)classes["value"];
并删除这一行:
classes["value"] = Newtonsoft.Json.JsonConvert.SerializeObject(appList).ToString();
我有一个具有这种结构的 school.json 文件:
{
"schoolConfig": [
{
"schoolTypeCode": "C1",
"schools": [
{
"schoolId": 456,
"config": [
{
"name": "Classes",
"value": [
{
"id": 1
},
{
"id": 2
}
]
}
]
},
{
"schoolId": 123,
"config": [
{
"name": "Classes",
"value": [
{
"id": 11
}
]
}
]
}
]
},
{
"schoolTypeCode": "C2",
"schools": [
{
"schoolId":50,
"config": [
{
"name": "Classes",
"value": [
{
"id": 12
}
]
}
]
},
{
"schoolId": 10,
"config": [
{
"name": "Classes",
"value": [
{
"id": 10
}
]
}
]
}
]
}
]
}
我想附加到 JSON 文件,该文件将更改任何过滤结果的配置值。因此,例如,输出 JSON 将具有:
"value": [
{
"id": 1
},
{
"id": 2
}
{
"id": 5
}
]
为用新的 json 替换现有的 json 而编写的 c# 代码是:
string json = File.ReadAllText(jsonFilePath);
dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
JToken classes = jsonObj.SelectToken("$.schoolConfig[?(@.schoolTypeCode == 'C1')].schools[?(@.schoolId == 456)].config[?(@.name == 'Classes')]");
List<JToken> appList = classes["value"].ToList();
var itemToAdd = new JObject();
itemToAdd["id"] = 5;
appList.Add(itemToAdd);
classes["value"] = Newtonsoft.Json.JsonConvert.SerializeObject(appList).ToString();
string output = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj, Newtonsoft.Json.Formatting.Indented);
File.WriteAllText(jsonFilePath, output);
文件被修改,除了值显示在一行中(没有缩进或格式)为
"value": "[{\"id\":1},{\"id\":2},{\"id\":5}]"
如何确保 JSON 文件不会在引号前显示额外的反斜杠,并以正确的格式呈现,如上所述。请指教
问题是您从 classes
对象中提取 value
数组作为 List<JToken>
而不是 JArray
。然后将列表序列化为字符串,然后再将其添加回 classes
。如果只是将其转换为JArray
而不是将其转换为List<JToken>
,则可以直接修改JArray
。
更改此行:
List<JToken> appList = classes["value"].ToList();
对此:
JArray appList = (JArray)classes["value"];
并删除这一行:
classes["value"] = Newtonsoft.Json.JsonConvert.SerializeObject(appList).ToString();