json.netを使用してjsonの逆シリアル化から動的オブジェクトを返すことは可能ですか?私はこのようなことをしたいと思います:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
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
JObject.ParseおよびJArray.Parseも参照してください
JArray.Parse
。
Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
Json.NET 4.0リリース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を使用することです。
コメントに対処するために更新(2014年11月12日):
これは完璧に機能します。デバッガーで型を調べると、値が実際には動的であることがわかります。根本的なタイプがありますJObject
。タイプを制御したい場合(の指定ExpandoObject
など)、そうします。
@Model.Prop
戻り値の型がJValueの場合、Razorで名前を使用できません。
JValue
です。デバッガー/イミディエイトウィンドウで作業していて、string
s だけが表示されていなかったため、どちらが混乱したか。Davidはこれを下のスクリーンショットで示しています。これJValue
は変換できるので、あなたはただ行うことができますstring m = jsonResponse.message
動的にデシリアライズするだけで、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"]);
JsonConvert
というメソッドが含まれていませんDeserialize
。
注: 2010年にこの質問に回答した時点では、なんらかのタイプなしでデシリアライズする方法はありませんでした。これにより、実際のクラスを定義せずにデシリアライズでき、匿名クラスを使用してデシリアライズを実行できました。
逆シリアル化する型の種類が必要です。あなたは次の線に沿って何かをすることができます:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
私の答えは、JSONシリアライザーでの.NET 4.0のビルドのソリューションに基づいています。匿名型への逆シリアル化へのリンクはここにあります:
JObjectを含まない古いバージョンでJSON.NETを使用する場合。
これは、JSONから動的オブジェクトを作成するもう1つの簡単な方法です。https: //github.com/chsword/jdynamic
NuGetインストール
PM> Install-Package JDynamic
次のようなメンバーにアクセスするための文字列インデックスの使用をサポートします。
dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);
テストケース
そして、あなたはこのユーティリティを次のように使うことができます:
直接値を取得
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.IEnumerable
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.