JSON.net JObject添加为GrandChild而不是Direct Child

时间:2017-04-19 02:46:13

标签: c# json.net

如果有从JObject到JProperty的Cast或部分副本,我不会问这个问题。

如果它存在,JObject.AddAsChild(otherJObj)也可以工作。

以下片段产生了一个GrandChild FavoriteFruit属性,但我想要一个Direct Child FavoriteFruit。 FavoriteFruit.FavoriteFruit双深酒店不是我想做的。

我在我的情况下控制所有代码。

使得最明显的解决方案在我的情况下不起作用的细节是我只得到最终的JObject来表示“FavoriteFruit” - 我没有运行时访问生成该特定的Favorite Fruit JObject实例的内容。

 JObject childFavoritFruitJObj = new JObject(); // child JObject
 if (true)
 {
     JProperty childFruitNameJProp = new JProperty("FruitName", "Pear");
     JObject childFruitInfoJObj = new JObject();
     childFruitInfoJObj.Add(childFruitNameJProp);
     childFavoritFruitJObj.Add("FavoriteFruit", childFruitInfoJObj);
     // only JObject childFavoritFruitJObj remains in scope
 }

 JObject parentPersonTopJObj = new JObject(); // Final Parent JObject
 JProperty parentPersonNameJProp = new JProperty("PersonName", "John Doe");

 parentPersonTopJObj.Add(parentPersonNameJProp);
 parentPersonTopJObj.Add("FavoriteFruit", childFavoritFruitJObj);  // INCORRECT  

 Console.WriteLine(parentPersonTopJObj.ToString());

 // Final Result - Not As Desired
 //   There are TWO "FavoriteFruit" Objects
 //   FavoriteFruit is a GRAND CHILD not a Child as wanted
 // {
 //   "PersonName": "John Doe",
 //   "FavoriteFruit": {
 //     "FavoriteFruit": {
 //       "FruitName": "Pear"
 //     }
 //   }
 // }
 //

下一个代码是针对此特定情况的已接受解决方案。

   // This is the undesired BAD scenario - this was the original question
   parentPersonTopJObj.Add("FavoriteFruit", childFavoritFruitJObj);

   // This is the accepted SOLUTION proposed below by Sailesh 
   JProperty propFirst = null;
   propFirst = (JProperty)childFavoritFruitJObj.First;
   parentPersonTopJObj.Add(propFirst);

   // the above works in my specific case as I am guarnteed 
   // a single property name at the top of my JObject.  If you had 
   // multiple Properties at the top this would not work.;

重载的.Add运算符具有单个param属性版本,不会创建宏子场景。更重要的是,Sailesh向我展示了如何使用.First

获取JToken对象

1 个答案:

答案 0 :(得分:1)

您可以使用JObject的First,Next和Last Properties访问child。

parentPersonTopJObj.Add(childFavoritFruitJObj.First);

希望这一行有助于你所需要的。