Я пытаюсь добавить объект JSON из некоторого текста в существующий файл JSON с помощью JSON.Net. Например, если у меня есть данные 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."
Я на самом деле пробовал несколько разных способов, но, похоже, ничего не добился. В моем примере я действительно хочу добавить новый элемент в "fruit". Пожалуйста, дайте мне знать, есть ли лучший способ сделать это или более простую библиотеку для использования.
JObject.Parse
последней строки. Поскольку это также работает для простых объектов, таких как строка.JProperty
другой, вы можете использовать этотReplace
метод. Если вы просто хотите изменить значениеJProperty
, вы можете установить для негоValue
свойство; он доступен для записи. См. Справку по API LINQ-to-JSON .TL; DR: вы должны добавить JProperty к JObject. Просто. Индексный запрос возвращает JValue, поэтому выясните, как вместо этого получить JProperty :)
Принятый ответ не отвечает на вопрос, как кажется. Что, если я хочу добавить свойство JProperty после определенного? Во-первых, давайте начнем с терминологии, которая действительно заставила меня задуматься.
"name":"value"
.Теперь, когда вы запрашиваете элемент Json с помощью index [], вы получаете JToken без идентификатора, который может быть JContainer или JValue (требуется приведение), но вы не можете ничего добавить после него, потому что это всего лишь значение. Вы можете изменить его, запросить более глубокие значения, но, например, вы не можете ничего добавить после него.
На самом деле вы хотите получить все свойство целиком, а затем при желании добавить после него еще одно свойство. Для этого вы используете
JOjbect.Property("name")
, а затем создаете другое свойство JP по вашему желанию, а затем добавляете его после этогоAddAfterSelf
метода using . Тогда все готово.Для получения дополнительной информации: 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); } } }
источник
JToken
(неJValue
) является базовым классом , из которогоJArray
,JObject
,JProperty
и , вJValue
конечном счете наследует.JValue
является примитивом JSON, представляющим строку, число, логическое значение, дату или значение NULL; он не может представлять массив или объект. См. Справочник по API LINQ-to-JSON .Просто добавив
.First
к вашемуbananaToken
должно сделать это: в основном проходит мимо, чтобы сделать его вместо .foodJsonObj["food"]["fruit"]["orange"].Parent.AddAfterSelf(bananaToken
.First
);
.First
{
JProperty
JToken
@ Брайан Роджерс, спасибо, я забыл
.Parent
. Отредактированоисточник