TL;DR: JProperty を JObject に追加する必要があります。単純。インデックス クエリは JValue を返すので、代わりに JProperty を取得する方法を見つけてください :)
受け入れられた答えは、見た目どおりに質問に答えていません。特定の JProperty の後に JProperty を具体的に追加したい場合はどうすればよいですか? まず、頭を悩ませていた用語から始めましょう。
- JToken = 他のすべての型の母。JValue、JProperty、JArray、または JObject のいずれかです。これは、解析メカニズムにモジュール設計を提供するためです。
- JValue = 任意の Json 値タイプ (string、int、boolean)。
- JProperty = 任意の JValue または JContainer (以下を参照) と名前 (識別子)の組み合わせ。たとえば
"name":"value"
。
- JContainer = 他のタイプ (JObject、JValue) を含むすべてのタイプのマザー。
- JObject = JProperties のコレクションを保持する JContainer タイプ
- JArray = コレクション JValue または JContainer を保持する JContainer タイプ。
ここで、インデックス [] を使用して Json アイテムをクエリすると、JContainer または JValue (キャストが必要) の可能性がある識別子なしで JToken を取得しますが、それは単なる値であるため、その後に何も追加することはできません。それ自体を変更したり、より深い値を照会したりできますが、たとえば、その後に何も追加することはできません。
実際に取得したいのはプロパティ全体であり、その後に必要に応じて別のプロパティを追加します。このために、 を使用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);
}
}
}