我有一个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
答案 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