我正在尝试使用JSON.Net将一些文本中的JSON对象添加到现有的JSON文件中。例如,如果我有如下的JSON数据:
{
"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 bananaToken = bananaJson as JToken;
foodJsonObj["food"]["fruit"]["orange"].AddAfterSelf(bananaToken);
但这会给出错误:"Newtonsoft.Json.Linq.JProperty cannot have multiple values."
实际上,我已经尝试了几种不同的方法,但似乎什么都不能实现。在我的示例中,我真正想做的是将新项添加到“水果”中。如果有更好的方法或者更简单的库可以使用,请告诉我。
发布于 2013-04-03 16:21:36
我认为您对JSON.Net中的什么可以容纳什么感到困惑。
JToken
是任何类型的JSON值的通用表示。它可以是字符串、对象、数组、属性等。JProperty
是一个与名称成对的JToken
值。它只能添加到JObject
中,并且它的值不能是另一个JProperty
.JObject
是JProperties
的集合。它不能直接持有任何其他类型的JToken
。在您的代码中,您试图将一个JObject
(包含“香蕉”数据的那个)添加到一个已经有值的JProperty
("orange")中(一个包含{"colour":"orange","size":"large"}
的JObject
)。如您所见,这将导致错误。
您真正想要做的是将一个名为"banana“的JProperty
添加到包含另一个水果JProperties
的JObject
中。以下是修改后的代码:
JObject foodJsonObj = JObject.Parse(jsonText);
JObject fruits = foodJsonObj["food"]["fruit"] as JObject;
fruits.Add("banana", JObject.Parse(@"{""colour"":""yellow"",""size"":""medium""}"));
发布于 2015-06-14 12:40:12
TL;DR:您应该向JObject添加一个JProperty。很简单。索引查询将返回一个JValue,因此请了解如何获取JProperty :)
公认的答案并不是像看起来那样回答问题。如果我想在一个特定的JProperty之后特别地添加一个one,该怎么办?首先,让我们从真正让我头昏脑胀的术语开始。
"name":"value"
.现在,当您使用索引[]查询Json item时,您得到的是不带标识符的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);
}
}
}
发布于 2015-02-13 08:36:31
只需在您的bananaToken
中添加.First
就可以了:
foodJsonObj["food"]["fruit"]["orange"].Parent.AddAfterSelf(bananaToken
.First);
.First
基本上超越了{
,使其成为JProperty
而不是JToken
.
@布莱恩·罗杰斯,谢谢我忘了带.Parent
。编辑过的
https://stackoverflow.com/questions/15413825
复制相似问题