我正在尝试更新 JToken 的值,但它的引用没有得到更新。
JSON 字符串:
{
"Title": "master",
"Presentation": [
{
"Component": {
"Content": {
"Title": "Set New Title",
}
}
}
]
}
用法如下
JObject jo = JObject.Parse(File.ReadAllText(file.json));
foreach (var token in jo.SelectTokens("$..Component.Content").Children())
{
JProperty prop = token.ToObject<JProperty>();
prop.Value = "New Title";
}
string jsonText = JsonConvert.SerializeObject(jo, Formatting.Indented);
在此示例中,我尝试更新 Title 属性的值。它在foreach中得到更新,这意味着局部变量正在更新,但变化没有反映在主jobject中。
如果我做错了什么,谁能帮助我?
一旦你调用ToObject
那么你正在使用一个副本。相反,如果您尝试这样做,它应该可以工作:
JObject jo = JObject.Parse(File.ReadAllText(file.json));
foreach (var prop in jo.SelectTokens("$..Component.Content")
.Children().OfType<JProperty>())
{
prop.Value = "New Title";
}
string jsonText = JsonConvert.SerializeObject(jo, Formatting.Indented);
或处理多种类型的JToken
:
JObject jo = JObject.Parse(File.ReadAllText(file.json));
foreach (var token in jo.SelectTokens("$..Component.Content")
.Children())
{
var prop = token as JProperty;
if (prop != null) prop.Value = "New Title";
var array = token as JArray;
if (array != null)
{
// some other logic
}
}
string jsonText = JsonConvert.SerializeObject(jo, Formatting.Indented);
Stuart 的答案可能是错误的,因为"内容"可能包含其他子主题,并且所有主题都可以重命名或更改其值。
我遇到了类似的问题。我需要从正文中删除值,因为它对于日志记录来说太长了,而且没有必要,所以我需要更改它的值。我可以使用像 token["name"] 这样的索引器来更改它,但"name"可能是不同的情况,所以我需要一种通用的与大小写无关的方式来擦除它的值:
我以其他方式实现它:
var jObject = JObject.Parse(body);
JToken token;
if (jObject.TryGetValue(
Constants.FieldName,
StringComparison.InvariantCultureIgnoreCase,
out token))
{
var jProperty = token.Parent as JProperty;
if (jProperty != null)
{
jProperty.Value = "removed";
}
body = jObject.ToString(Formatting.Indented);
}
在这里,你有一个很好的例子,说明你如何以适当的方式做到这一点。上面的两个解决方案都对我不起作用,但这很简单是的。只需将 JToken 或 Object 作为数组使用即可。就这样。
https://www.newtonsoft.com/json/help/html/ModifyJson.htm