web-dev-qa-db-ja.com

Newtonsoft JSONデシリアライズ

私のJSONは次のとおりです。

{"t":"1339886","a":true,"data":[],"Type":[['Ants','Biz','Tro']]}

Newtonsoft JSON.NET C#用の逆シリアル化ライブラリを見つけました。私はそれを次のように使用しようとしました:

object JsonDe = JsonConvert.DeserializeObject(Json); 

JsonDeオブジェクトにアクセスして、すべての「タイプ」データを取得するにはどうすればよいですか?ループで試してみましたが、オブジェクトに列挙子がないため動作しません。

76
abc cba

JSONにあるフィールドを保持するクラスを実装できます

class MyData
{
    public string t;
    public bool a;
    public object[] data;
    public string[][] type;
}

次に、DeserializeObjectの汎用バージョンを使用します。

MyData tmp = JsonConvert.DeserializeObject<MyData>(json);
foreach (string typeStr in tmp.type[0])
{
    // Do something with typeStr
}

ドキュメント: JSONのシリアル化とデシリアライズ

126
Michael Banzon

はるかに簡単なソリューション:動的な型を使用する

Json.NET 4.0リリース1では、ネイティブ 動的 がサポートされています。クラスを宣言する必要はなく、dynamicを使用するだけです:

dynamic jsonDe = JsonConvert.DeserializeObject(json);

すべてのフィールドが使用可能になります。

foreach (string typeStr in jsonDe.Type[0])
{
    // Do something with typeStr
} 

string t = jsonDe.t;
bool a = jsonDe.a;
object[] data = jsonDe.data;
string[][] type = jsonDe.Type;

dynamic を使用すると、データを保持するために特定のクラスを作成する必要がありません。

76
Yves M.

Newtonsoft Documentation に従って、次のように匿名オブジェクトに逆シリアル化することもできます。

var definition = new { Name = "" };

string json1 = @"{'Name':'James'}";
var customer1 = JsonConvert.DeserializeAnonymousType(json1, definition);

Console.WriteLine(customer1.Name);
// James
8
SomethingOn