Десериализиране на JSON обектен масив с Json.net класове

Опитвам се да използвам API за получаване на отчети, но имам проблеми с получаването на резултатите от JSON в използваема информация с помощта на JSON.NET. Разгледах доста примери, но правилният формат на класа за класовете ми убягва.

JSON данни:

{
    "status": "OK",
    "data": {
        "event": {
            "Time": "2015-09-01 17:31:47",
            "Username": "user1",
            "IP_Address": "1.2.3.4",
            "Action": "action1",
            "Data": "somedata"
        },
        "event": {
            "Time": "2015-09-01 17:30:30",
            "Username": "user2",
            "IP_Address": "1.2.3.5",
            "Action": "action2",
            "Data": "data"
        }
    }
}

Къде съм сега:

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;

public class aRoot
{
  [JsonProperty("status")]
  public string status { get; set; }
  [JsonProperty("data")]
  public aData data { get; set; }
}

public class aData
{
  [JsonProperty("event")]
  public List<aEvents> events { get; set; }
}

public class aEvents
{
  [JsonProperty("Time")]
  public DateTime time { get; set; }
  [JsonProperty("UserName")]
  public string user { get; set; }
  [JsonProperty("IP_Address")]
  public string ip { get; set; }
  [JsonProperty("Action")]
  public string action { get; set; }
  [JsonProperty("Data")]
  public string data { get; set; }
}
aRoot objReporting = JsonConvert.DeserializeObject<aRoot>(result);

Някой има ли идеи?

Редактиране: Изход за грешка:

Възникна изключение от тип „Newtonsoft.Json.JsonSerializationException“ в Newtonsoft.Json.dll, но не беше обработено в потребителския код

Допълнителна информация: Не може да се десериализира текущият JSON обект (напр. {"name":"value"}) в тип 'System.Collections.Generic.List`1[aEvents]', защото типът изисква JSON масив (напр. [1,2 ,3]), за да се десериализира правилно.

За да коригирате тази грешка или променете JSON на JSON масив (напр. [1,2,3]) или променете десериализирания тип, така че да е нормален .NET тип (напр. не примитивен тип като цяло число, а не тип колекция като масив или списък), които могат да бъдат десериализирани от JSON обект. JsonObjectAttribute може също да се добави към типа, за да го принуди да се десериализира от JSON обект.

Път 'data.event.Time', ред 1, позиция 39.


person Marty    schedule 09.09.2015    source източник
comment
Да, да видим грешката. Елементът с данни не изглежда правилно. Не трябва ли да е масив? Пример: данни: [ събитие: {...}, ... ] или може би дори Пример: данни: [ {...}, {...}, ... ]   -  person mrunion    schedule 09.09.2015
comment
Вашият data обект има две свойства с едно и също име event. Няма безопасен начин за достъп до тях. Разбира се, можете да използвате някои трикове за достъп до първия/втория, но това би било само хак.   -  person Eser    schedule 09.09.2015
comment
след като дефинирате правилно своя json, можете да опитате да получите класа c# с json2csharp.com   -  person Juan    schedule 09.09.2015
comment
@JuanC. json е правилен, но не е много използваем   -  person Eser    schedule 09.09.2015
comment
Вашият "data" JSON обект има свойства с дублирани имена. За предложения как да четете такъв JSON вижте Как да десериализирате JSON с дублирани имена на свойства в един и същи обект или Json.NET (Newtonsoft.Json) - Две "свойства" с едно и също име?. Ще трябва да напишете персонализиран JsonConverter за aData, като използвате тези два отговора като ръководство.   -  person dbc    schedule 10.09.2015
comment
Добавена грешка към OP. Съгласен съм, че json не е идеален, но се генерира от трета страна, така че нямам никакъв контрол върху него, освен да го редактирам ръчно преди анализиране.   -  person Marty    schedule 10.09.2015
comment
Трябва също така да поясня, че оригиналният json дойде като Event1, Event2, Event3 и т.н., но за създаване на класове избрах да използвам регулярен израз, за ​​да го настроя на събитие за класа aData.   -  person Marty    schedule 10.09.2015
comment
Аррггггхххххх. Класически XY-проблем.... Вашият проблем сега може да бъде нанесен на stackoverflow.com/questions/24536533/ Просто използвайте речник.... голям -1   -  person Eser    schedule 10.09.2015
comment
@Marty - това решение беше грешка. Опитайте да декларирате events като Dictionary<string, aEvents> и трябва да сте готови да използвате оригиналния json.   -  person dbc    schedule 10.09.2015
comment
@dbc благодаря човече. Точно това трябваше да направя. Получих работа.   -  person Marty    schedule 10.09.2015


Отговори (1)


Опитайте да промените данните си на:

{
"status": "OK",
"data": [
    {
        "Time": "2015-09-01 17:31:47",
        "Username": "user1",
        "IP_Address": "1.2.3.4",
        "Action": "action1",
        "Data": "somedata"
    },
    {
        "Time": "2015-09-01 17:30:30",
        "Username": "user2",
        "IP_Address": "1.2.3.5",
        "Action": "action2",
        "Data": "data"
    }
]}

И след това променете класа си на:

public class aRoot
{
  [JsonProperty("status")]
  public string status { get; set; }
  [JsonProperty("data")]
  public List<aEvents> data { get; set; }
}

Нямате нужда от "aData".

person andygjp    schedule 09.09.2015
comment
Мисля, че I'm trying to use an API противоречи на Try changing your data to - person Eser; 09.09.2015