web-dev-qa-db-ja.com

Json.netを使ってjsonオブジェクトを動的オブジェクトに逆シリアル化する

Json.netを使用してJSON逆シリアル化から動的オブジェクトを返すことは可能ですか?私はこのようなことをしたいのですが。

dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
388
ryudice

最新のjson.netバージョンはこれを可能にします:

dynamic d = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}");

Console.WriteLine(d.number);
Console.WriteLine(d.str);
Console.WriteLine(d.array.Count);

出力:

 1000
 string
 6

ドキュメントはこちら:Json.NETによるLINQ to JSON

499

Json.NET 4.0 Release 1以降、ネイティブの動的サポートがあります。

[Test]
public void DynamicDeserialization()
{
    dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}");
    jsonResponse.Works = true;
    Console.WriteLine(jsonResponse.message); // Hi
    Console.WriteLine(jsonResponse.Works); // True
    Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true}
    Assert.That(jsonResponse, Is.InstanceOf<dynamic>());
    Assert.That(jsonResponse, Is.TypeOf<JObject>());
}

そしてもちろん、現在のバージョンを入手する最善の方法はNuGetを使うことです。

コメントに対処するために(11/12/2014)を更新しました:

これは完全にうまくいきます。デバッガで型を調べると、値が実際には dynamic であることがわかります。 基本型 JObjectです。あなたが(ExpandoObjectを指定するように)タイプを制御したい場合は、そうしてください。

enter image description here

98
David Peden

動的にデシリアライズするだけでJObjectが返されます。 ExpandoObjectを使って欲しいものを手に入れることができます。

var converter = new ExpandoObjectConverter();    
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
50
Joshua Peterson

これは古い投稿ですが、JsonConvertには実際には別のメソッドがあるので、

var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
37
epitka

はい、JsonConvert.DeserializeObjectを使ってそれを行うことができます。それをするには、単純にするだけです:

dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
20
oteal

注: 2010年にこの質問に答えた時点では、ある種の型なしでは直列化復元する方法はありませんでした。これにより、実際のクラスを定義しなくても匿名化クラスを使用できます。逆シリアル化を行います。


デシリアライズするには何らかの種類が必要です。あなたは以下の行に沿って何かをすることができます。

var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());

私の答えは、JSONシリアライザで.NET 4.0をビルドするためのソリューションに基づいています。匿名型に逆シリアル化するためのリンクはこちらです。

http://blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx

17
Phill

あなたがJObjectではなかった古いバージョンでJSON.NETを使うならば。

これはJSONから動的オブジェクトを作るもう一つの簡単な方法です: https://github.com/chsword/jdynamic

NuGetインストール

PM> Install-Package JDynamic

次のようにメンバーにアクセスするための文字列インデックスの使用をサポートします。

dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);

テストケース

そして、あなたは以下のようにこのutilを使うことができます:

値を直接取得する

dynamic json = new JDynamic("1");

//json.Value

2. jsonオブジェクトのメンバを取得します

dynamic json = new JDynamic("{a:'abc'}");
//json.a is a string "abc"

dynamic json = new JDynamic("{a:3.1416}");
//json.a is 3.1416m

dynamic json = new JDynamic("{a:1}");
//json.a is integer: 1

3.列挙型

dynamic json = new JDynamic("[1,2,3]");
/json.Length/json.Count is 3
//And you can use json[0]/ json[2] to get the elements

dynamic json = new JDynamic("{a:[1,2,3]}");
//json.a.Length /json.a.Count is 3.
//And you can use  json.a[0]/ json.a[2] to get the elements

dynamic json = new JDynamic("[{b:1},{c:1}]");
//json.Length/json.Count is 2.
//And you can use the  json[0].b/json[1].c to get the num.

その他の

dynamic json = new JDynamic("{a:{a:1} }");

//json.a.a is 1.
5
chsword

はい、可能です。私はずっとそれをしています。

dynamic Obj = JsonConvert.DeserializeObject(<your json string>);

ネイティブではないタイプの場合は少し面倒です。 Objの中にClassAとClassBのオブジェクトがあるとします。それらはすべてJObjectに変換されます。あなたがする必要があるのは、

ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();
0
s k