TL;DR: 将 JProperty 添加到 JObject 中,可以使用 AddAfterSelf 方法在特定的 JProperty 后添加新的属性。
接受的答案似乎没有回答问题。如果我想要在特定的 JProperty 后面添加一个 JProperty 呢?首先,让我们从术语开始,这些术语真的让我头疼。
- JToken = 所有其他类型的母体。它可以是 JValue、JProperty、JArray 或 JObject。这是为了提供可扩展的解析机制。
- JValue = 任何 Json 值类型(字符串、整数、布尔值)。
- JProperty = 任何带有名称(标识符)的 JValue 或 JContainer(见下文)。例如,
"name":"value"
。
- JContainer = 包含其他类型(JObject、JValue)的所有类型的母体。
- JObject = 一种 JContainer 类型,保存了一组 JProperties。
- JArray = 一种 JContainer 类型,保存了一组 JValue 或 JContainer。
当使用索引[]查询Json条目时,您会得到没有标识符的JToken,它可能是JContainer或JValue(需要转换),但是您不能在其后添加任何内容,因为它只是一个值。您可以更改它本身,查询更深的值,但是例如您不能在其后添加任何内容。
实际上你需要获取整个属性,然后根据需要添加另一个属性。为此,您可以使用
JOjbect.Property("name")
,然后创建所需的另一个JProperty,并使用
AddAfterSelf
方法在它后面添加。这样就完成了。
更多信息请参见:
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);
}
}
}
JProperty
为另一个不同的对象,那么你可以使用Replace
方法。如果你只想改变JProperty
的值,你可以在它上面设置Value
属性;它是可写的。请参阅LINQ-to-JSON API reference。 - Brian Rogers