JObjectを使用してオンザフライでJSONを作成する


95

一部の単体テストでは、テスト対象のシステムの入力として使用できる特定のJSON値(この場合はレコードアルバム)を構築する機能が必要です。

私は次のコードを持っています:

var jsonObject = new JObject();
jsonObject.Add("Date", DateTime.Now);
jsonObject.Add("Album", "Me Against The World");
jsonObject.Add("Year", 1995);
jsonObject.Add("Artist", "2Pac");

これは問題なく動作しますが、私は「マジックストリング」構文が本当に好きではなく、次のようなJavaScriptのexpando-property構文に近いものを好みます。

jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against The World";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";

5
アーティスト/アルバムの選択で2倍のポイントを獲得する必要があります!
spottedmahn

回答:


142

さて、どうですか:

dynamic jsonObject = new JObject();
jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against the world";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";

3
完璧!まさに私が探していたもの、完全に忘れていましたdynamic
カールアンダーソン

コードを実行しようとすると、「Newtonsoft.Json.Linq.JObject」に「Date」エラーの定義が含まれていません。:私はそれを動作させることができな方法は、最初に行を変更しているdynamic jsonExpando = new ExpandoObject();し、あなたのコードの後の行を追加しますJObject jsonObject = JObject.FromObject(jsonExpando);
BornToCode

3
List <>をJsonオブジェクトに追加する場合は、のようなことを行う必要がありますjsonObject.list = JToken.FromObject(mylist);
スティーブスミス

Create-Yearなどの特殊文字を含むフィールド名をヒットした場合は、インデックスとプロパティ表記を組み合わせて使用​​できます。jsonObject.Create-Year= 1995と書くことはできませんが、次のように使用できます。jsonObject["Create-Year 「] = 1995; jsonObject.Artist = "2パック";
PAS

71

このJObject.Parse操作を使用して、一重引用符で区切られたJSONテキストを指定するだけです。

JObject  o = JObject.Parse(@"{
  'CPU': 'Intel',
  'Drives': [
    'DVD read/writer',
    '500 gigabyte hard drive'
  ]
}");

これには、実際にJSONであるという優れた利点があるため、JSONとして読み取られます。

または、動的なテストデータがありJObject.FromObject、操作を使用してインラインオブジェクトを提供できます。

JObject o = JObject.FromObject(new
{
    channel = new
    {
        title = "James Newton-King",
        link = "http://james.newtonking.com",
        description = "James Newton-King's blog.",
        item =
            from p in posts
            orderby p.Title
            select new
            {
                title = p.Title,
                description = p.Description,
                link = p.Link,
                category = p.Categories
            }
    }
});

シリアル化に関するJson.netドキュメント


10
JObject.FromObjectを正解としてマークする必要があります。ありがとう。
トーマス

1
JObject.FromObjectような特殊文字を持つプロパティがあると機能しないと思います-
Jatin Sanghvi 2017年

39

有効なC#変数名ではないJSONプロパティがある場合dynamic、またはJObject.FromObjectソリューションは機能しません"@odata.etag"。テストケースでは、インデクサー初期化構文を好みます。

JObject jsonObject = new JObject
{
    ["Date"] = DateTime.Now,
    ["Album"] = "Me Against The World",
    ["Year"] = 1995,
    ["Artist"] = "2Pac"
};

初期化JObjectとプロパティの追加のために個別の囲み記号のセットがあると、特に以下のような複合JSONオブジェクトの場合に、インデックス初期化子が従来のオブジェクト初期化子よりも読みやすくなります。

JObject jsonObject = new JObject
{
    ["Date"] = DateTime.Now,
    ["Album"] = "Me Against The World",
    ["Year"] = 1995,
    ["Artist"] = new JObject
    {
        ["Name"] = "2Pac",
        ["Age"] = 28
    }
};

オブジェクト初期化構文を使用すると、上記の初期化は次のようになります。

JObject jsonObject = new JObject
{
    { "Date", DateTime.Now },
    { "Album", "Me Against The World" },
    { "Year", 1995 }, 
    { "Artist", new JObject
        {
            { "Name", "2Pac" },
            { "Age", 28 }
        }
    }
};

2
最後のものは、c#でjsonを書くのに間違いなく最良の構文です。
アンソニーBrenelière

コレクションでもこれを行う方法については、stackoverflow.com
questions / 51015036 /…を

30

動的を使用できない環境(Xamarin.iOSなど)や、以前の有効な回答に代わるものを探すだけの場合があります。

これらの場合、次のことができます。

using Newtonsoft.Json.Linq;

JObject jsonObject =
     new JObject(
             new JProperty("Date", DateTime.Now),
             new JProperty("Album", "Me Against The World"),
             new JProperty("Year", "James 2Pac-King's blog."),
             new JProperty("Artist", "2Pac")
         )

その他のドキュメントはこちら:http//www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm


2

プロパティからnewtonsoftJObjectを作成する簡単な方法。

これはサンプルのユーザープロパティです

public class User
{
    public string Name;
    public string MobileNo;
    public string Address;
}

そして、newtonsoftJObjectでこのプロパティが必要です。

JObject obj = JObject.FromObject(new User()
{
    Name = "Manjunath",
    MobileNo = "9876543210",
    Address = "Mumbai, Maharashtra, India",
});

出力は次のようになります。

{"Name":"Manjunath","MobileNo":"9876543210","Address":"Mumbai, Maharashtra, India"}

2

遅かれ早かれ、あなたは特別な性格を持つ財産を持つでしょう。インデックスを使用することも、インデックスとプロパティを組み合わせて使用​​することもできます。

dynamic jsonObject = new JObject();
jsonObject["Create-Date"] = DateTime.Now; //<-Index use
jsonObject.Album = "Me Against the world"; //<- Property use
jsonObject["Create-Year"] = 1995; //<-Index use
jsonObject.Artist = "2Pac"; //<-Property use

これはどのように質問に答えますか?
謎めいた

@Enigmativity、私が指摘しているのは、インデックス表記とプロパティ表記を一緒に使用できるということです。つまり、obj [x] = x1; obj.y = y1は同じコードで使用できます。動的キーワードとインデックス表記の組み合わせが質問に答えます。これについて言及している回答は他にありません。おそらく、これは答えよりもコメントであるべきです。
PAS

質問はマジックストリングを使わないことだと思いますが、この答えは彼にそれを与えています。
謎めいた

@Enigmativity、動的キーワードはコンパイラをだますだけです。したがって、任意の文字列と同じです。動的型のオブジェクトは強く型付けされていません。それは単なる構文糖衣です。基になるオブジェクトにプロパティがない場合、実行時に失敗します。ただし、プロパティの名前に99BottlesOfBeer、名前空間、It's-All-Overなどの特殊文字が含まれている場合は、プロパティを使用できません。したがって、そのような場合は、インデックス付きのプロパティを使用できます。他の答えは、それがどちらかであると思わせますが、プロパティとインデックスを組み合わせて組み合わせることができます。
PAS

-3

Newtonsoftライブラリを使用して次のように使用できます

using Newtonsoft.Json;



public class jb
{
     public DateTime Date { set; get; }
     public string Artist { set; get; }
     public int Year { set; get; }
     public string album { set; get; }

}
var jsonObject = new jb();

jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against The World";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";


System.Web.Script.Serialization.JavaScriptSerializer oSerializer =
         new System.Web.Script.Serialization.JavaScriptSerializer();

string sJSON = oSerializer.Serialize(jsonObject );

5
ここでは実際にはライブラリnewtonsoftを使用していません
Mickey Perlstein 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.