将JSON对象反序列化为C#列表

8
我正在尝试使用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;

2
目前还不清楚您的实际问题是什么。DATACLASS是什么? - 48klocs
非常抱歉!问题在于我的代码无法正常运行(Debugger.Break())。DATACLASS即上文中提到的“class Data”。(对于这个让人困惑的名称我很抱歉。你可以将其理解为“数据”) - user2282587
我在谈论RootObject - 不是Data!Data定义了元素,而RootObject则定义了列表本身。 - user2282587
1个回答

22

所以我认为你可能正在尝试对错误的类型进行反序列化。如果你将其序列化为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; }
}

编辑:添加完整代码。


我试了你的代码。我添加了以下几行以便显示它。你看到错误了吗(它没有工作,没有错误,只是没有变化)?string t = deserializedItemsFromItems.ToString(); PhoneList.ItemsSource = t; string v = deserializedRootFromRoot.ToString(); PhoneList.ItemsSource = v; - user2282587
上面的代码在遇到 var deserializedItemsFromRoot = JsonConvert.DeserializeObject<List<Item>>(rootSerialized); 这一行时,不会立即正常工作,它会抛出一个异常。 - cgotberg
你在反序列化或分配ItemsSource方面遇到了问题吗?假设你得到了一个反序列化的对象,那么something.ItemsSource = Root.Items.ToList();应该可以工作。 - cgotberg
非常感谢cgotberg。终于可以工作了!你的“ToList”提示起到了作用。 - user2282587

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接