json.net反序列化为对象数组c#

时间:2013-10-07 11:17:52

标签: c# arrays json

我有一个POCO类,如下所示:

public class Item : Asset
{
    public int PlaylistId { get; set; }
    public int AssetId { get; set; }
    public double Duration { get; set; }
    public int Order { get; set; }
}

资产如下所示:

public enum AssetType
{
    Image = 1,
    Video,
    Website
}

public class Asset
{       

    public int Id { get; set; }
    public string Name { get; set; }
    public string Filename { get; set; }
    public AssetType Type { get; set; }
    public string CreatedById { get; set; }
    public string ModifiedById { get; set; }
    [Display(Name="Created by")] public string CreatedBy { get; set; }
    [Display(Name="Modified by")] public string ModifiedBy { get; set; }
}

然后我有一个json文件,如下所示:

{
   "Items":[
      {
         "PlaylistId":1,
         "Type":2,
         "Duration":19,
         "Filename":"stream1_mpeg4.avi"
      },
      {
         "PlaylistId":1,
         "Type":2,
         "Duration":21,
         "Filename":"stream2_mpeg4.avi"
      }
   ]
}

最后我的代码看起来像这样:

public IList<Item> GetAll()
{
    if (File.Exists(itemsPath))
    {
        using (var fs = new FileStream(itemsPath, FileMode.Open))
        using (var sr = new StreamReader(fs))
        {
            var text = sr.ReadToEnd();
            var array = JsonConvert.DeserializeObject<Item[]>(sr.ReadToEnd());
            return array.ToList();
        }
    }
    else
        throw new FileNotFoundException("Unable to find the playlist, please make sure that " + itemsPath + " exists.");
}

text 变量包含正确的json字符串,但数组为null,因此 array.ToList();抛出错误。 有谁知道我做错了什么?

提前干杯 / r3plica

2 个答案:

答案 0 :(得分:3)

您已拨打ReadToEnd()两次,因此第二次没有更多文字可供广告阅读:

var text = sr.ReadToEnd();
var array = JsonConvert.DeserializeObject<Item[]>(sr.ReadToEnd());

只需将第二个sr.ReadToEnd()替换为text,它就应该有效:

var array = JsonConvert.DeserializeObject<Item[]>(text);

另外,正如@Sachin正确指出的那样,你的json代表一个对象,它有一个名为Items的属性,它是Item个对象的数组或列表。
因此,您应该通过@ Sachin的答案中所示的中间类,或者使用字典,如下所示:

var dict = JsonConvert.DeserializeObject<Dictionary<string,Item[]>>(text);
var array = dict["Items"];

答案 1 :(得分:2)

json string表示对象的序列化,该对象具有List<Item>作为其属性。这意味着您需要将此字符串反序列化为具有List<Item>属性的对象。所以你可以创建一个这样的包装类

public class Wrapper
{
    public List<Item> items { get; set; }
}

然后像这样反序列化

var array = JsonConvert.DeserializeObject<Wrapper>(text);

现在你可以看到你的数组里面有两个元素,即。 array.Count=2