TL; DR: вы должны добавить JProperty к JObject. Просто. Индексный запрос возвращает JValue, поэтому выясните, как вместо этого получить JProperty :)
Принятый ответ не отвечает на вопрос, как кажется. Что, если я хочу добавить свойство JProperty после определенного? Во-первых, давайте начнем с терминологии, которая действительно заставила меня задуматься.
- JToken = мать всех остальных типов. Это может быть JValue, JProperty, JArray или JObject. Это обеспечивает модульную конструкцию механизма синтаксического анализа.
- JValue = любой тип значения Json (string, int, boolean).
- JProperty = любой JValue или JContainer (см. Ниже) в паре с именем (идентификатором) . Например
"name":"value".
- JContainer = мать всех типов, которые содержат другие типы (JObject, JValue).
- JObject = тип JContainer, содержащий коллекцию JProperties
- JArray = тип JContainer, который содержит коллекцию JValue или JContainer.
Теперь, когда вы запрашиваете элемент 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);
}
}
}
JObject.Parseпоследней строки. Поскольку это также работает для простых объектов, таких как строка.