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文字列が含まれていますが、配列nullであるため、array.ToList() ; エラーをスローします。私が間違っていることを誰かが知っていますか?

よろしくお願いします /r3plica

4

2 に答える 2

3

2 回呼び出しReadToEnd()ているため、2 回目はストリームで読み取るテキストがありません。

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

sr.ReadToEnd()2番目を次のように置き換えるだけ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プロパティとしてa を持つオブジェクトのシリアル化を表しますList<Item>。つまり、この文字列をList<Item>プロパティとして持つオブジェクトに逆シリアル化する必要があります。したがって、このようなラッパークラスを作成できます

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

そして、このようにデシリアライズします

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

これで、配列の中に 2 つの要素があることがわかります。array.Count=2

于 2013-10-07T11:19:47.010 に答える