TL; DR: Bạn nên thêm JProperty vào JObject. Đơn giản. Truy vấn chỉ mục trả về một JValue, vì vậy hãy tìm cách lấy JProperty thay thế :)
Câu trả lời được chấp nhận không phải là trả lời câu hỏi như nó có vẻ. Điều gì sẽ xảy ra nếu tôi muốn thêm một JProperty cụ thể vào sau một cái cụ thể? Đầu tiên, chúng ta hãy bắt đầu với các thuật ngữ thực sự khiến tôi phải đau đầu.
- JToken = Mẹ của tất cả các loại khác. Nó có thể là A JValue, JProperty, JArray hoặc JObject. Điều này là để cung cấp một thiết kế mô-đun cho cơ chế phân tích cú pháp.
- JValue = bất kỳ kiểu giá trị Json nào (string, int, boolean).
- JProperty = bất kỳ JValue hoặc JContainer nào (xem bên dưới) được ghép nối với một tên (định danh) . Ví dụ
"name":"value".
- JContainer = Mẹ của tất cả các kiểu chứa các kiểu khác (JObject, JValue).
- JObject = một kiểu JContainer chứa một tập hợp các JProperties
- JArray = một kiểu JContainer chứa một tập hợp JValue hoặc JContainer.
Bây giờ, khi bạn truy vấn mục Json bằng chỉ mục [], bạn đang nhận được JToken mà không có mã định danh, có thể là JContainer hoặc JValue (yêu cầu ép kiểu), nhưng bạn không thể thêm bất kỳ thứ gì vào sau nó, vì nó chỉ là một giá trị. Bạn có thể tự thay đổi nó, truy vấn các giá trị sâu hơn, nhưng bạn không thể thêm bất cứ thứ gì vào sau nó chẳng hạn.
Những gì bạn thực sự muốn nhận được là toàn bộ thuộc tính, và sau đó thêm một thuộc tính khác sau nó như mong muốn. Đối với điều này, bạn sử dụng JOjbect.Property("name"), và sau đó tạo một JProperty khác mà bạn mong muốn và sau đó thêm nó vào sau khi sử dụngAddAfterSelf phương pháp này. Bạn đã hoàn thành sau đó.
Để biết thêm thông tin: http://www.newtonsoft.com/json/help/html/ModifyJson.htm
Đây là mã tôi đã sửa đổi.
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, ở dòng cuối cùng. Vì điều này cũng hoạt động đối với các đối tượng đơn giản như chuỗi.