Newtonsoft Json数组反序列化还是这只是一个列表

时间:2019-04-18 20:34:51

标签: c# json json.net

https://status.cloud.google.com/incidents.json上,如果我没记错的话,Google正在使用Json Array。我正在使用Newtonsoft.Json并使用下面的代码反序列化json。我使用正确的方法提取json吗?

using (var webClient = new WebClient())
{
    String rawJSON = webClient.DownloadString("https://status.cloud.google.com/incidents.json");
    StatusCollection statusCollection = JsonConvert.DeserializeObject<StatusCollection>(rawJSON);
    Console.WriteLine(statusCollection.Statuses.Count);
}

status.cs

namespace StatusJSONv1
{

    public class Status
    {
        string Begin { get; set; }
        string Created { get; set; }
        string End { get; set; }
        string External_desc { get; set; }
        string Modified { get; set; }
        MRUpdateContainer Most_recent_update { get; set; }
        int Number { get; set; }
        bool Public { get; set; }
        string Service_key { get; set; }
        string Service_name { get; set; }
        string Severity { get; set; }
        List<Update> Updates { get; set; }
        string Uri { get; set; }
    }


    public class MRUpdateContainer
    {
        string Created { get; set; }
        string Modified { get; set; }
        string Text { get; set; }
        string When { get; set; }
    }
    public class Update
    {
        string Created { get; set; }
        string Modified { get; set; }
        string Text { get; set; }
        string When { get; set; }
    }
}

1 个答案:

答案 0 :(得分:1)

是的,您链接到的JSON是一个JSON数组。因此,您需要将其反序列化为列表(或数组)。

List<Status> statusCollection = JsonConvert.DeserializeObject<List<Status>>(rawJSON);
Console.WriteLine(statusCollection.Count);

您的代码还有其他一些问题:

  1. 您的类属性都必须为public,否则Json.Net将无法访问它们。
  2. 您的Most_recent_update类中的Status属性与JSON中的名称不匹配(JSON为此属性使用连字符)。要解决此问题,您需要在类中使用[JsonProperty]属性,如下所示:

    [JsonProperty("most-recent-update")]
    public MRUpdateContainer Most_recent_update { get; set; }
    

    只要您想在类中使用与JSON中不同的属性名称,就可以随时使用[JsonProperty]

提琴:https://dotnetfiddle.net/8FtAJg