47

サードパーティの API を呼び出して単一クラスのデータを取得できる場合、このコードを使用してすべてが正常にデシリアライズされます

TheUser me = jsonSerializer.Deserialize(response, typeof(TheUser)) as TheUser

次のような配列である JSON 応答コンテンツを逆シリアル化しようとすると、問題が発生します。

{
   "data": [
      {
         "name": "A Jones",
         "id": "500015763"
      },
      {
         "name": "B Smith",
         "id": "504986213"
      },
      {
         "name": "C Brown",
         "id": "509034361"
      }
   ]
}

「データ」メンバーの周りにカスタムラッピングクラスを使用し、そのメンバーがタイプである必要がある場合にのみ、シリアライゼーションを機能させることができますList<object>。タイプとしてそれらがある場合、メソッドからList<TheUser>取得します。ArgumentExceptionJsonParser DesializeType

本来はこんな感じでラッピングの型抜きで連載しようと思っていたのですが

List<TheUser> freinds = jsonSerializer.Deserialize(response, typeof(List<TheUser>)) as List<TheUser>;

しかし、それは空のコレクションを返すだけです。確かに、配列を厳密に型指定されたリストに逆シリアル化できる必要があります。

4

8 に答える 8

34

ソースを見た後、WP7 Hammock は実際には JSON 解析に Json.Net を使用しないためです。代わりに、カスタム型にうまく対応できない独自のパーサーを使用します。

Json.Netを直接使用すると、ラッパー オブジェクト内の厳密に型指定されたコレクションに逆シリアル化できます。

var response = @"
    {
        ""data"": [
            {
                ""name"": ""A Jones"",
                ""id"": ""500015763""
            },
            {
                ""name"": ""B Smith"",
                ""id"": ""504986213""
            },
            {
                ""name"": ""C Brown"",
                ""id"": ""509034361""
            }
        ]
    }
";

var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass));

return des.data.Count.ToString();

そして:

public class MyClass
{
    public List<User> data { get; set; }
}

public class User
{
    public string name { get; set; }
    public string id { get; set; }
}

data プロパティを使用して追加のオブジェクトを作成する必要があるのは面倒ですが、これは JSON 形式のオブジェクトが構築される方法の結果です。

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

于 2011-05-13T10:11:51.603 に答える
16

試す

List<TheUser> friends = jsonSerializer.Deserialize<List<TheUser>>(response);
于 2011-05-12T19:00:18.130 に答える
11

これは、JSONをオブジェクトの配列に逆シリアル化するために機能しました。

List<TheUser> friends = JsonConvert.DeserializeObject<List<TheUser>>(response);
于 2013-01-18T19:30:05.373 に答える
8

Json.NET - ドキュメンテーション

http://james.newtonking.com/json/help/index.html?topic=html/SelectToken.htm

著者のための解釈

var o = JObject.Parse(response);
var a = o.SelectToken("data").Select(jt => jt.ToObject<TheUser>()).ToList();
于 2014-03-19T09:30:24.077 に答える
2

パット、json構造は、私がここで説明した問題に非常に馴染みがあるように見えます-私にとっての答えは、エントリが1つしかない場合でも、json表現をDictionary <TKey、TValue>として扱うことでした。

私が正しければ、あなたのキーは文字列型であり、List <T>の値です。ここで、Tはクラス'TheUser'を表します。

HTH

PS- Silverlight Serializerを使用してより良いシリアル化パフォーマンスをチェックアウトしたい場合は、WP7バージョンの恥知らずなプラグを構築する必要があります-私はこれについてブログ投稿を書きまし

于 2011-05-13T10:25:20.963 に答える
0

問題は、json がユーザーのリストをプロパティとして持つオブジェクトを表しているためだと思われます。次のようなものに逆シリアル化してみてください。

public class UsersResponse
{
    public List<User> Data { get; set; }
}
于 2011-05-13T09:56:58.120 に答える