反序列化JSON非标准数字数组

时间:2018-01-28 06:02:51

标签: c# json restsharp

我正在使用RestSharp来反序列化JSON字符串。但是,我陷入了非标准结构:“000000001409026”,“000000001364365”,“869103022800595”。

数字000000001409026,000000001364365,869103022800595是gps设备的Id编号,因此JSON响应中可能有一个或多个Id编号。使用RestSharp对Web服务进行查询时获得的文件如下:

{
  "status": 200,
  "data": [
    {
      "000000001409026": {
        "Fecha": "2018-01-26",
        "Kilometros": "84.17",
        "Odometro": "8,292.27",
        "Horas": "3.18"
      }
    },
    {
      "000000001364365": {
        "Fecha": "2018-01-26",
        "Kilometros": "0.00",
        "Odometro": "0.00",
        "Horas": "0.00"
      }
    },
    {
      "869103022800595": {
        "Fecha": "2018-01-26",
        "Kilometros": "0.00",
        "Odometro": "0.00",
        "Horas": "0.00"
      }
    }
  ]
}

我正在使用的课程如下:

public class GpsOdometro
    {
       public string Fecha { get; set; }
       public string Kilometros { get; set; }
       public string Odometro { get; set; }
       public string  Horas { get; set; }
    }

    public class GpsEquipo
    {
        public Dictionary<string,GpsOdometro> GpsOdometro { get; set; }
    }

    public class RootObject
    {
        public string status { get; set; }
        public List<GpsEquipo> data { get; set; }
    }

然后我反序列化获得的json,但是当我想在datagridview中显示它时,数据不会显示。

IRestResponse json = client.Execute(request);
RootObject result = JsonConvert.DeserializeObject<RootObject>(json.Content);
DgOdometro.DataSource = result.data;

我需要帮助来正确处理这个json结构并获取gps数据。 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

DeserializeObjectdata中列出3个列表,但这些列表中的词典为null。您可以从json中获取数据以逐一填充它们

RootObject result = JsonConvert.DeserializeObject<RootObject>(json.Content);
JToken dataToken = JObject.Parse(json.Content).SelectToken("data");
int i = 0;
foreach (JProperty property in dataToken.Children().SelectMany(child => ((JObject)child).Properties()))
{
    result.data[i++].GpsOdometro =
        new Dictionary<string, GpsOdometro>
        {
            { property.Name, JObject.Parse(o2.ToString()).SelectToken(property.Path).ToObject<GpsOdometro>() }
        };
}