Данные JSON конвертировать в класс C # - PullRequest
0 голосов
/ 27 октября 2018

У меня есть следующий JSON, который мне нужно десериализовать:

 [
      {
        "Facility": "H&S 01",
        "Address": [ "5999 Cerritos Ave." ],
        "City": [ "anaheim" ],
        "State": [ "ca" ],
        "ZipCode": [ 92831 ],
        "AQDMID": [ 1 ],
        "Jan": 222.0,
        "Feb": 434.0,
        "March": 343.0,
        "April": 431.0,
        "May": 222.0,
        "June": 345.0,
        "July": 666.0,
        "Aug": 643.0,
        "Sep": 0.0,
        "Oct": 0.0,
        "Nov": 0.0,
        "Dec": 0.0,
        "Total": 3306.0
      },
      {
        "Facility": "H&S 02",
        "Address": [ "1515 N. Garey Ave." ],
        "City": [ "hshsh" ],
        "State": [ "ca" ],
        "ZipCode": [ 92831 ],
        "AQDMID": [ 2 ],
        "Jan": 122.0,
        "Feb": 234.0,
        "March": 234.0,
        "April": 263.0,
        "May": 234.0,
        "June": 124.0,
        "July": 223.0,
        "Aug": 444.0,
        "Sep": 122.0,
        "Oct": 211.0,
        "Nov": 343.0,
        "Dec": 423.0,
        "Total": 2977.0
      }
    ]

Я использовал http://jsontotable.com/ для создания классов, представляющих мои данные, и получил следующее:

public class Root
{
    public DateTime Facility {get;set;}
    public List<string> Address {get;set;}
    public List<string> City {get;set;}
    public List<string> State {get;set;}
    public List<string> ZipCode {get;set;}
    public List<string> AQDMID {get;set;}
    public int Jan {get;set;}
    public int Feb {get;set;}
    public int March {get;set;}
    public int April {get;set;}
    public int May {get;set;}
    public int June {get;set;}
    public int July {get;set;}
    public int Aug {get;set;}
    public string Sep {get;set;}
    public string Oct {get;set;}
    public string Nov {get;set;}
    public string Dec {get;set;}
    public int Total {get;set;}
}

Я пытаюсь десериализовать свои данные, используя JSON.NET:

 List<Root> fetch = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Root>>(json);

Но это не десериализовано в мой класс C #.

Ответы [ 4 ]

0 голосов
/ 27 октября 2018

Если вы не хотите использовать класс C #, вы можете использовать динамический объект

Пример:

string thejson = @"{
""error_code"": 0,
""access_token"": ""*******************"",
""expires_in"": 7200
}";

dynamic data = Json.Decode(thejson);
string theToken = data.access_token;

Вам понадобится System.Web.Helpers

0 голосов
/ 27 октября 2018

Я рекомендую использовать json2cshap для преобразования данных в классы C # или параметр меню Edit | Paste Special | Paste as JSON classes в Visual Studio.Кажется, что используемая вами служба не очень хорошо угадывает, что представляют поля.

Ваш класс не соответствует вашему JSON:

"Facility": "H&S 01",
"Facility": "H&S 02",

Это not DateTime объекты, как заявлено в вашей модели: public DateTime Facility {get;set;}

Я немного смущен вашими значениями int и string Jan-Dec и вашим Total value.Все значения в вашем JSON являются десятичными, но в вашей модели C # они представлены в виде целых чисел и строк.Я рекомендую для этих целей использовать double или decimal.

Фиксированный класс может выглядеть следующим образом:

public class Root
{
    public string Facility { get; set; }
    public List<string> Address { get; set; }
    public List<string> City { get; set; }
    public List<string> State { get; set; }
    public List<string> ZipCode { get; set; }
    public List<string> AQDMID { get; set; }
    public double Jan { get; set; }
    public double Feb { get; set; }
    public double March { get; set; }
    public double April { get; set; }
    public double May { get; set; }
    public double June { get; set; }
    public double July { get; set; }
    public double Aug { get; set; }
    public double Sep { get; set; }
    public double Oct { get; set; }
    public double Nov { get; set; }
    public double Dec { get; set; }
    public double Total { get; set; }
}

Помните, что ваш класс C # должен выглядеть как ваши данные, иJSON.NET хорошо говорит вам, где именно находится проблема.При попытке десериализации ваших данных в ваш класс я получил следующие две ошибки:

Newtonsoft.Json.JsonReaderException: «Не удалось преобразовать строку в DateTime: H & S 01. Path» [0] .Facility ',строка 1, позиция 21. '

Это привело меня к проверке поля Facility в ваших данных и классе C #.

Newtonsoft.Json.JsonReaderException:' InputСтрока '222.0' не является допустимым целым числом.Путь '[0] .Jan', строка 1, позиция 131. '

Аналогично, это привело меня к проверке значений января-декабря в ваших данных JSON и классе C #.

Обратите внимание, что вы должны предоставить эту информацию об исключениях в своем вопросе, чтобы помочь людям помочь вам.

0 голосов
/ 27 октября 2018

Просто нам нужно изменить Root Class как и использовал это в будущем. Json2Cshrap

 public class Root
    {
        public string Facility { get; set; }
        public List<string> Address { get; set; }
        public List<string> City { get; set; }
        public List<string> State { get; set; }
        public List<string> ZipCode { get; set; }
        public List<string> AQDMID { get; set; }
        public double Jan { get; set; }
        public double Feb { get; set; }
        public double March { get; set; }
        public double April { get; set; }
        public double May { get; set; }
        public double June { get; set; }
        public double July { get; set; }
        public double Aug { get; set; }
        public double Sep { get; set; }
        public double Oct { get; set; }
        public double Nov { get; set; }
        public double Dec { get; set; }
        public double Total { get; set; }
    }
0 голосов
/ 27 октября 2018

Вам нужно создать структуру примерно так.

public class Data
{
     public List<Root> Root {get;set;}
}

public class Root
{
    public DateTime Facility {get;set;}
    public List<string> Address {get;set;}
    public List<string> City {get;set;}
    public List<string> State {get;set;}
    public List<string> ZipCode {get;set;}
    public List<string> AQDMID {get;set;}
    public int Jan {get;set;}
    public int Feb {get;set;}
    public int March {get;set;}
    public int April {get;set;}
    public int May {get;set;}
    public int June {get;set;}
    public int July {get;set;}
    public int Aug {get;set;}
    public string Sep {get;set;}
    public string Oct {get;set;}
    public string Nov {get;set;}
    public string Dec {get;set;}
    public int Total {get;set;}
}

После этого вы сможете де-десерилизовать ее с помощью

List<Root> fetch = Newtonsoft.Json.JsonConvert.DeserializeObject<Data>(json);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...