[英]Unable to update JToken value
我正在嘗試更新 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 中更新,意味着局部變量正在更新,但更改未反映在主作業中。
如果我做錯了什么,有人可以幫助我嗎?
調用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 的回答可能是錯誤的,因為“內容”可能包含其他子元素,並且所有主題都可以重命名或更改它們的值。
我遇到過類似的問題。 我需要從 body 中刪除 value,因為它太長而無法記錄並且沒有必要,所以我需要更改它的 value。 我可以用像 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 作為數組使用。 就這樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.