89

JSON.Netを使用して、テキストから既存のJSONファイルにJSONオブジェクトを追加しようとしています。たとえば、次のような JSON データがあるとします。

  {
  "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 bananaToken = bananaJson as JToken;
foodJsonObj["food"]["fruit"]["orange"].AddAfterSelf(bananaToken);

しかし、これはエラーを与えます:"Newtonsoft.Json.Linq.JProperty cannot have multiple values."

私は実際にいくつかの異なる方法を試しましたが、どこにも行けないようです。私の例では、本当にやりたいことは、新しいアイテムを「フルーツ」に追加することです。これを行うためのより良い方法または使用するより簡単なライブラリがあれば教えてください。

4

3 に答える 3

39

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);
    }
  }
}
于 2015-06-14T04:40:11.830 に答える
5

.Firstあなたに追加するだけでそれを行うbananaToken必要があります。
foodJsonObj["food"]["fruit"]["orange"].Parent.AddAfterSelf(bananaToken .First);
.First{JPropertyJToken

@Brian Rogers、忘れてしまいました.Parent。編集済み

于 2015-02-13T00:36:31.140 に答える