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アイテムをクエリすると、識別子のないJTokenが取得されます。これはJContainerまたはJValue(キャストが必要)の場合がありますが、値にすぎないため、その後に何も追加できません。それ自体を変更したり、より深い値をクエリしたりすることはできますが、たとえば、その後に何も追加することはできません。
実際に取得したいのはプロパティ全体であり、必要に応じてその後に別のプロパティを追加します。このために、を使用し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);
}
}
}
JObject.Parse最後の行では、の代わりに「JToken.Parse」(または「JToken.FromObject」)を使用してください。これは文字列などの単純なオブジェクトでも機能するためです。