TL; DR: Ви повинні додати JProperty до JObject. Простий. Індексний запит повертає значення JValue, тому з’ясуйте, як натомість отримати JProperty :)
Прийнята відповідь - це не відповідь на питання, як здається. Що робити, якщо я хочу спеціально додати JProperty після конкретного? По-перше, давайте почнемо з термінологій, які насправді розробили мою голову.
- JToken = Мати всіх інших типів. Це може бути JValue, JProperty, JArray або JObject. Це передбачає модульну конструкцію механізму розбору.
- JValue = будь-який тип значення Json (рядок, int, логічне значення).
- JProperty = будь-який JValue або JContainer (див. Нижче) в парі з ім'ям (ідентифікатором) . Наприклад
"name":"value" .
- JContainer = Мати всіх типів, які містять інші типи (JObject, JValue).
- JObject = тип JContainer, що містить колекцію JProperties
- JArray = тип JContainer, що містить колекцію JValue або JContainer.
Тепер, коли ви запитуєте елемент Json за допомогою індексу [], ви отримуєте JToken без ідентифікатора, який може бути JContainer або JValue (вимагає кастингу), але після нього ви не можете нічого додати, оскільки це лише значення. Ви можете змінити її саму, запитати більш глибокі значення, але після цього, наприклад, нічого не можна додати.
Що ви насправді хочете отримати, це властивість у цілому, а потім додайте іншу властивість після неї за бажанням. Для цього ви використовуєте JOjbect.Property("name"), а потім створюєте іншу властивість JP за вашим бажанням, а потім додаєте її після цього за допомогою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);
}
}
}
JObject.Parse, в останньому рядку. Оскільки це також працює для простих об'єктів, таких як рядок.