web-dev-qa-db-ja.com

JSONオブジェクトをC#リストに逆シリアル化する

Bill Reissによるチュートリアル を使用して、C#で特定のJSONファイルを逆シリアル化しようとしています。リスト以外のXMLデータの場合、このメソッドは非常にうまく機能しますが、次の構造を持つJSONファイルを逆シリアル化したいと思います。

public class Data
{
    public string Att1 { get; set; }
    public string Att2 { get; set; }
    public string Att3 { get; set; }
    public string Att4 { get; set; }
}

public class RootObject
{

public List<Data> Listname { get; set; }
}

私の問題は、JSON.Netの機能を使用してデータを作成/リストに入れ、そのリストをXAMLページに表示することです。これまでの私の考え(これは機能していません):

var resp = await client.DoRequestJsonAsync<DATACLASS>("URL");
string t = resp.ToString();
var _result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<DATACLASS>>(t);
XAMLELEMENT.ItemsSource = _result;
8
user2282587

したがって、おそらく間違った型に逆シリアル化しようとしていると思います。 RootObjectにシリアル化し、Listに逆シリアル化しようとすると、失敗します。

このサンプルコードを見る

public void TestMethod1()
    {
        var items = new List<Item>
                        {
                            new Item { Att1 = "ABC", Att2 = "123" }, 
                            new Item { Att1 = "EFG", Att2 = "456" }, 
                            new Item { Att1 = "HIJ", Att2 = "789" }
                        };
        var root = new Root() { Items = items };
        var itemsSerialized = JsonConvert.SerializeObject(items);
        var rootSerialized = JsonConvert.SerializeObject(root);

        //This works
        var deserializedItemsFromItems = JsonConvert.DeserializeObject<List<Item>>(itemsSerialized); 

        //This works
        var deserializedRootFromRoot = JsonConvert.DeserializeObject<Root>(rootSerialized); 

        //This will fail.  YOu serialized it as root and tried to deserialize as List<Item>
        var deserializedItemsFromRoot = JsonConvert.DeserializeObject<List<Item>>(rootSerialized);

        //This will fail also for the same reason 
        var deserializedRootFromItems = JsonConvert.DeserializeObject<Root>(itemsSerialized);
    }

class Root
{
    public IEnumerable<Item> Items { get; set; } 
}

class Item
{
    public string Att1 { get; set; }
    public string Att2 { get; set; }
}

編集:完全なコードを追加しました。

22
cgotberg