Json.netを使用してJSON逆シリアル化から動的オブジェクトを返すことは可能ですか?私はこのようなことをしたいのですが。
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
最新の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
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
を指定するように)タイプを制御したい場合は、そうしてください。
動的にデシリアライズするだけでJObjectが返されます。 ExpandoObjectを使って欲しいものを手に入れることができます。
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
これは古い投稿ですが、JsonConvertには実際には別のメソッドがあるので、
var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
はい、JsonConvert.DeserializeObjectを使ってそれを行うことができます。それをするには、単純にするだけです:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
注: 2010年にこの質問に答えた時点では、ある種の型なしでは直列化復元する方法はありませんでした。これにより、実際のクラスを定義しなくても匿名化クラスを使用できます。逆シリアル化を行います。
デシリアライズするには何らかの種類が必要です。あなたは以下の行に沿って何かをすることができます。
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
私の答えは、JSONシリアライザで.NET 4.0をビルドするためのソリューションに基づいています。匿名型に逆シリアル化するためのリンクはこちらです。
あなたが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.
はい、可能です。私はずっとそれをしています。
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
ネイティブではないタイプの場合は少し面倒です。 Objの中にClassAとClassBのオブジェクトがあるとします。それらはすべてJObjectに変換されます。あなたがする必要があるのは、
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();