Десериализовать JSON в список - PullRequest
0 голосов
/ 25 апреля 2018

У меня проблемы с десериализацией объекта JSON в список.Мой объект JSON выглядит следующим образом:

[{
    "returnValue": [{
        "facility": "DRIO",
        "recrd_desc": "DEFAULT",
        "update_time": {
            "$date": 1509128545000
        },
        "control_num": 1,
        "starttime": {
            "$date": 1506830400000
        },
        "endtime": {
            "$date": 4102462799000
        },
        "can_exchange_rate": 2000
    },
    {
        "facility": "DRIO",
        "recrd_desc": "TEMP",
        "update_time": {
            "$date": 1521229607000
        },
        "control_num": 37,
        "starttime": {
            "$date": 1513040240000
        },
        "endtime": {
            "$date": 1544576240000
        },
        "can_exchange_rate": 2112
    },
    {
        "facility": "DRIO",
        "recrd_desc": "TEMP 3",
        "update_time": {
            "$date": 1521229399000
        },
        "control_num": 38,
        "starttime": {
            "$date": 1544576580000
        },
        "endtime": {
            "$date": 1576112580000
        },
        "can_exchange_rate": 2000
    }],
    "ok": 1.0
}]

, а мой класс C #:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace CSCApi.Models
{
    public class FareSchedResponse
    {
        public List<FareSched> ReturnValue { get; set; }
        public float Ok { get; set; }
    }

    public class FareSched
    {
        public string facility { get; set; }
        public string recrd_desc { get; set; }
        public Update_Time update_time { get; set; }
        public int control_num { get; set; }
        public Starttime starttime { get; set; }
        public Endtime endtime { get; set; }
        public int can_exchange_rate { get; set; }
    }

    public class Update_Time
    {
        public long date { get; set; }
    }

    public class Starttime
    {
        public long date { get; set; }
    }

    public class Endtime
    {
        public long date { get; set; }
    }
}

Проблема, которая возникает, заключается в том, что значение, возвращаемое для Update_Time, StartTime и EndTime, равно 0 вместофактических длинных значений.Я не уверен, где ошибка.

Любая помощь приветствуется.NH

Код десериализации:

using Newtonsoft.Json;

[HttpGet]
[Route("api/FareSchedule/GetFareChart/{ActivePlazaID}/{ControlNumber}")]
public async Task<IHttpActionResult> GetFareChartAsync(string ActivePlazaID, int ControlNumber)
{
    try
    {
        var json = await _dbCalls.GetFareChart(ActivePlazaID, ControlNumber);
        var r = ParseResponse<FareSchedResponse>(json);
        return Ok(r.ReturnValue);
    }
    catch (Exception e)
    {
        return BadRequest(e.Message);
    }
}

public static T ParseResponse<T>(string json)
{
    try
    {
        List<T> r = JsonConvert.DeserializeObject<List<T>>(FormatAsList(json));
        if (r != null)
            return r[0];
    }
    catch (Exception)
    {
    }
    return JsonConvert.DeserializeObject<T>(FormatAsList(json));
}

public static string FormatAsList(string json)
{
    try
    {
        var retVal = json;
        if (!string.IsNullOrWhiteSpace(retVal) && retVal.IndexOf(":[") <= 0)
        {
            retVal = retVal.Replace("[{\"returnValue\":", "[{\"returnValue\":[");
            retVal = retVal.Replace(",\"ok\":", "],\"ok\":");
            return retVal;
        }
    }
    catch (Exception)
    {
        // do nothing
    }
    return json;
}

1 Ответ

0 голосов
/ 27 апреля 2018

Как уже упоминал @maccetura, вам просто нужно использовать атрибут в ваших моделях.Таким образом, вы также можете иметь удобочитаемые имена свойств, соответствующие соглашениям об именах C #.Если вы используете JSON.NET, вы можете выбирать между JsonProperty или DataMember атрибутами.

Существует множество веб-сайтов, которые могут помочь вам сгенерировать модели C # на основе JSON.Просто Google что-то вроде JSON в C # .

Второй генератор, который я пробовал, был достаточно умен, чтобы использовать атрибут JsonProperty.Вот несколько примеров того, что я получил:

public partial class Time
{
    [JsonProperty("$date")]
    public long Date { get; set; }
}

public partial class ReturnValue
{
    [JsonProperty("facility")]
    public string Facility { get; set; }

    [JsonProperty("recrd_desc")]
    public string RecrdDesc { get; set; }

    [JsonProperty("update_time")]
    public Time UpdateTime { get; set; }  

    //Other properties
}

Надеюсь, вы легко сможете сгенерировать оставшиеся вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...