1

我有一个 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.");
}

正如我所料,文本变量包含正确的 json 字符串,但数组,因此array.ToList();引发错误。有谁知道我做错了什么?

提前干杯/r3plica

4

2 回答 2

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"];
于 2013-10-07T11:21:06.920 回答
2

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

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

然后像这样反序列化它

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

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

于 2013-10-07T11:19:47.010 回答