C# Json.NET - json 到 c# 对象

C# Json.NET - json to c# object

我有以下 json,我正在尝试使用 json.net 将其转换为 C# 对象。

{
    "torrents": [
        [
            "03FE02E76D99D94B9FF7689080F168C70BC2A3B7",
            136, "02 - Aleph One.mp3", 98206320,
            0, 0, 0, 0, 0, 0, 0, "",
            0, 0, 0, 0, 0, 2, 98206320,
            "", "", "Stopped 0.0 %", "4",
            1427414173, 0, "", "D:\downloading",
            0, "481B6500"
        ],
        [
            "6D5A14A99970EF0366F69BF21BD6633D19F8C80C",
             128, "01 - Infinity Mix 1.mp3", 279245285,
             0, 212992, 0, 0, 0, 0, 0, "",
             0, 0, 0, 0, 0, 1, 279032293,
             "", "", "Stopped 0.0 %", "3",
             1427414139, 0, "", "D:\downloading",
             0, "C32DD134"
        ]
    ]
}

我有以下代码,我不确定为什么它不起作用,也许有人可以指出正确的方向。

我收到的错误消息是:"Object reference not set to an instance of an object."

var ds = JsonConvert.DeserializeObject<TorrentList>(json);
MessageBox.Show(ds.Torrents[0].Name);

public class TorrentList
{
    public Torrent[] Torrents { get; set; }
}

[JsonConverter(typeof (TorrentJsonConverter))]
public class Torrent
{
    public String Hash { get; set; }
    public int Status { get; set; }
    public String Name { get; set; }
    public int Size { get; set; }
    public int Progress { get; set; }
    public int Downloaded { get; set; }
    public int Uploaded { get; set; }
    public int Ratio { get; set; }
    public int UploadSpeed { get; set; }
    public int DownloadSpeed { get; set; }
    public int Eta { get; set; }
    public String Label { get; set; }
    public int PeersConnected { get; set; }
    public int PeersInSwarm { get; set; }
    public int SeedsConnected { get; set; }
    public int SeedsInSwarm { get; set; }
    public int Availability { get; set; }
    public int TorrentOrder { get; set; }
    public int Remaining { get; set; }
    public String Unknown1 { get; set; }
    public String Unknown2 { get; set; }
    public String CurrentStatus { get; set; }
    public String Unknown3 { get; set; }
    public int Unknown4 { get; set; }
    public int Unknown5 { get; set; }
    public String Unknown6 { get; set; }
    public String FilePath { get; set; }
    public int Unknown7 { get; set; }
    public String Unknown8 { get; set; }
}

internal class TorrentJsonConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var obj = new Torrent
        {
            Hash = reader.ReadAsString(),
            Status = reader.ReadAsInt32().GetValueOrDefault(),
            Name = reader.ReadAsString(),
            Size = reader.ReadAsInt32().GetValueOrDefault(),
            Progress = reader.ReadAsInt32().GetValueOrDefault(),
            Downloaded = reader.ReadAsInt32().GetValueOrDefault(),
            Uploaded = reader.ReadAsInt32().GetValueOrDefault(),
            Ratio = reader.ReadAsInt32().GetValueOrDefault(),
            UploadSpeed = reader.ReadAsInt32().GetValueOrDefault(),
            DownloadSpeed = reader.ReadAsInt32().GetValueOrDefault(),
            Eta = reader.ReadAsInt32().GetValueOrDefault(),
            Label = reader.ReadAsString(),
            PeersConnected = reader.ReadAsInt32().GetValueOrDefault(),
            PeersInSwarm = reader.ReadAsInt32().GetValueOrDefault(),
            SeedsConnected = reader.ReadAsInt32().GetValueOrDefault(),
            SeedsInSwarm = reader.ReadAsInt32().GetValueOrDefault(),
            Availability = reader.ReadAsInt32().GetValueOrDefault(),
            TorrentOrder = reader.ReadAsInt32().GetValueOrDefault(),
            Remaining = reader.ReadAsInt32().GetValueOrDefault(),
            Unknown1 = reader.ReadAsString(),
            Unknown2 = reader.ReadAsString(),
            CurrentStatus = reader.ReadAsString(),
            Unknown3 = reader.ReadAsString(),
            Unknown4 = reader.ReadAsInt32().GetValueOrDefault(),
            Unknown5 = reader.ReadAsInt32().GetValueOrDefault(),
            Unknown6 = reader.ReadAsString(),
            FilePath = reader.ReadAsString(),
            Unknown7 = reader.ReadAsInt32().GetValueOrDefault(),
            Unknown8 = reader.ReadAsString()
        };
        reader.Read();
        return obj;
    }

在这里添加一个空检查,可能你的项目是空的,

if(ds != null)
{
   if(ds.count > 0 )
    { 
      if(ds.Torrents.count > 0)
       {
      MessageBox.Show(ds.Torrents[0].Name);
       }
   }
}