繁体   English   中英

无法更新 JToken 值

[英]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 作为数组使用。 就这样。

https://www.newtonsoft.com/json/help/html/ModifyJson.htm

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM