2017-12-15 11 views
0

が、私はそれのようなJSONとjオブジェクトを持って削除されません。だから私は、このようなコードを持っている:JArray.Remove(JTokenは)

JObject userJson = JObject.Parse(user); 

JArray groups = userJson["groups"] as JArray; 
JToken group = new JValue (groupName); 

groups.Remove(group); 

しかし方法JArray.remove(Jtokenアイテム)falseを返します(それはそれは削除することができなかったことを意味します)。ここでの情報:

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

だからJToken group = new JValue (groupName);JToken group = new JValue (groupName); as JTokenJValue group = new JValue (groupName);のようにパラメータを設定しようとしました。しかし、それは仕事をdoesntの:S

この男はJToken階層が非常に良い説明が、私は私が「かわかりません私は正しいことをしません。

https://stackoverflow.com/a/38560188/8849646

+0

「グループ名」とは何ですか? – dbc

答えて

0

基本的な問題はJToken階層グラフを二重に接続されていることです。つまり、各トークンはParentを認識し、各親はそのChildrenを知っています。実際に、既に親に親を持っているトークンを追加すると、それはhereのようにクローンになります。したがって

、すべてのトークンは、あなたが親からトークンを削除しようとすると、Json.NETは、2つのうちのいずれかを行う可能性がありますその親を、知っているので:

  1. 場合には、親から子を削除するかもしれません子は実際に親に属します(参照等価を使用)。OR
  2. 親の子として保存値を持つ子が親から削除されることがあります。

実際、Json.NETは前者のオプションを選択します。 Jarray.Remove(JToken item)は、JContainer.RemoveItem()を呼び出して、JArray.IndexOfItem()を呼び出して削除するアイテムのインデックスを決定します。この方法は、順番に、参照の等価を使用しています。

internal override int IndexOfItem(JToken item) 
{ 
    return _values.IndexOfReference(item); 
} 

あなたJToken group = new JValue (groupName)は、それが除去されず、JArray groupsに属していないので。

JSON配列アイテムを値で削除する方法はありますか?あなたは可能性:LINQを使用して

  • 検索:複雑なオブジェクトだけでなく、プリミティブ値を検索するために使用することができますJTokenEqualityComparerを使用して

    groups.Where(i => i.Type == JTokenType.String && (string)i == groupName).ToList().ForEach(i => i.Remove()); 
    
  • 検索、:

    var comparer = new JTokenEqualityComparer(); 
    groups.Where(i => comparer.Equals(i, group)).ToList().ForEach(i => i.Remove()); 
    
  • 検索SelectTokens()

    userJson.SelectTokens(string.Format("groups[?(@ == '{0}')]", groupName)).ToList().ForEach(i => i.Remove()); 
    

    SelectTokens()は、一致するアイテムの配列を検索できるようにするJSONPath query syntaxをサポートしています。

最後に、RemoveItem()ためdocumentationに関する注意。

JArray.Remove Method (JToken)

がJArrayから特定オブジェクトの最初発生を削除します。これは、(追加イタリック)を述べています。

親に追加されたときに親を持つトークンがクローン化されていることから、特定の親の中にトークンが1つしか存在しないように見えることがあります。しかし、ドキュメンテーションはそうでないことを示唆しているようです。私はこの特定の文書の文章は廃止されており、同じトークンが親の中に複数回現れることがあるJson.NETのかなり前のバージョンのものであると推測しています。

0
//Removing obj from oldArray 
private static JArray RemoveValue(JArray oldArray, dynamic obj) 
{ 
    List<string> temp2 = oldArray.ToObject<List<string>>(); 
    temp2.Remove(obj); 
    return JArray.FromObject(temp2); 
} 
関連する問題