web-dev-qa-db-ja.com

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

一部の単体テストでは、テスト対象のシステムの入力として使用できる特定の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のexpand-property構文に近いものを好みます。

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

さて、どうですか:

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

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ドキュメント

60
Lee Jensen

動的(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

28
Daniele D.

有効なC#変数名ではないJSONプロパティがある場合、dynamicJObject.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 }
        }
    }
};
26
Jatin Sanghvi

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

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

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

そして、私はnewtonsoft JObjectのこのプロパティが欲しいです:

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

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

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

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

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
0
PAS