2017-01-12 4 views
3

JTokenの値を更新しようとしていますが、参照が更新されていません。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に反映されていません。

何か間違っていると誰でも助けてくれますか?

答えて

5

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); 
+0

ありがとうスチュアート。できます! – Balaji

+0

もう少し簡単な質問です。私のJSONオブジェクトは、プロパティまたは配列型を持つこともできます。子どもからジェネリック型を得るためには、とにかくありますか?または、私は2つのループを置く必要がありますか? 1つはjproperty用、もう1つはjarray用です – Balaji

+0

@Balaji確かに、私は私の答えを更新しました – Stuart

1

「コンテンツ」は他が含まれている可能性があるため、スチュアートからの答えが間違っかもしれ子どもたちとテーマのすべてを名前を変更するか、その値を変更することができます。

私も同様の問題が発生しました。 身体から、私は値を取り除く必要がありました。なぜなら、ロギングには時間がかかりすぎて不必要なので、値を変更する必要があったからです。 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); 
} 
関連する問題