TL;DR:您应该将 JProperty 添加到 JObject。简单的。索引查询返回一个 JValue,因此请弄清楚如何获取 JProperty :)
接受的答案并没有像看起来那样回答问题。如果我想在特定的 JProperty 之后专门添加一个 JProperty 怎么办?首先,让我们从真正让我头疼的术语开始。
- JToken = 所有其他类型的母亲。它可以是 JValue、JProperty、JArray 或 JObject。这是为解析机制提供模块化设计。
- JValue = 任何 Json 值类型(字符串、整数、布尔值)。
- JProperty = 任何与名称(标识符)配对的 JValue 或 JContainer(见下文) 。例如
"name":"value"
.
- JContainer = 包含其他类型(JObject、JValue)的所有类型的母体。
- JObject = 包含 JProperties 集合的 JContainer 类型
- 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);
}
}
}