TL; DR:应该将JProperty添加到JObject。简单。索引查询返回一个JValue,因此找出如何获取JProperty :)
可接受的答案似乎并未回答该问题。如果要在特定的JProperty之后专门添加JProperty,该怎么办?首先,让我们从真正让我精打细算的术语开始。
- JToken =所有其他类型的母亲。它可以是JValue,JProperty,JArray或JObject。这是为解析机制提供模块化设计。
- JValue =任何Json值类型(字符串,整数,布尔值)。
- JProperty =与名称(标识符)配对的任何JValue或JContainer(请参见下文)。例如
"name":"value"。
- JContainer =包含其他类型(JObject,JValue)的所有类型的母亲。
- JObject =一个JContainer类型,其中包含JProperties的集合
- JArray =包含集合JValue或JContainer的JContainer类型。
现在,当使用索引[]查询Json项时,您将获得不带标识符的JToken,该标识符可能是JContainer或JValue(需要强制转换),但是您不能在其后添加任何内容,因为它只是一个值。您可以自己更改它,查询更深的值,但是不能在其后添加任何内容。
您真正想要获得的是整个属性,然后根据需要在其后添加另一个属性。为此,请使用JOjbect.Property("name"),然后创建所需的另一个JProperty,然后在此usingAddAfterSelf方法之后添加它。到此为止。
有关更多信息:http : //www.newtonsoft.com/json/help/html/ModifyJson.htm
这是我修改的代码。
public class Program
{
public static void Main()
{
try
{
string jsonText = @"
{
""food"": {
""fruit"": {
""apple"": {
""colour"": ""red"",
""size"": ""small""
},
""orange"": {
""colour"": ""orange"",
""size"": ""large""
}
}
}
}";
var foodJsonObj = JObject.Parse(jsonText);
var bananaJson = JObject.Parse(@"{ ""banana"" : { ""colour"": ""yellow"", ""size"": ""medium""}}");
var fruitJObject = foodJsonObj["food"]["fruit"] as JObject;
fruitJObject.Property("orange").AddAfterSelf(new JProperty("banana", fruitJObject));
Console.WriteLine(foodJsonObj.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.GetType().Name + ": " + ex.Message);
}
}
}
JObject.Parse在最后一行使用'JToken.Parse'(或'JToken.FromObject')代替。因为这也适用于简单的对象,例如字符串。