Как десериализовать JSON с дочерним атрибутом в ОДИН объект в C # - PullRequest
1 голос
/ 19 мая 2019

Мой объект JSON состоит из непротиворечивых атрибутов udid, date, event_id и различных, но известных атрибутов внутри parameters. Ниже есть два объекта:

      {
        "udid": "70baf33f-f011-44ee-b35a-6064b5ab468d",
        "date": "2018-01-01",
        "event_id": 2,
        "parameters": {
          "gender": "male",
          "age": 13,
          "country": "India"
        }
      },
      {
        "udid": "70baf33f-f011-44ee-b35a-6064b5ab468d",
        "date": "2018-01-01",
        "event_id": 1,
        "parameters": {}
      }

Такой JSON может быть представлен внутри одного объекта, если я перемещу параметры на верхнем уровне следующим образом:

public class Event
{
    [Key]
    public int Id { get; set; }
    public string udid { get; set; }
    public DateTime date { get; set; }
    public int event_id { get; set;}
    public string gender { get; set; }
    public int age { get; set; }
    public string country { get; set; }
    public int stage { get; set; }
    public bool win { get; set; }
    public int time { get; set; }
    public int income { get; set; }
    public string name { get; set; }
    public double price { get; set; }
    public string item { get; set; }
}

Итак, как мне эффективно десериализовать это, потому что у меня около 30 миллионов таких записей? Я использую newtonsoft.json.


Edit:

В итоге я создал три объекта (вложенных Parameters внутри EventNested) и сплющил Event, как советовал Лиам. Я случайно десериализовал json в EventNested, а затем переназначил его в Event, используя это громоздкое выражение LINQ:

List<EventNested> eventsNested = JsonConvert.DeserializeObject<List<EventNested>>(json);
List<Event> events = eventsNested.Select(x=> new Event {
        date = x.date,
        udid = x.udid,
        event_id = x.event_id,
        parametersAge = x.Parameters.age,
        parametersCountry = x.Parameters.country, 
        parametersGender = x.Parameters.gender, 
        parametersIncome = x.Parameters.income,
        parametersItem = x.Parameters.item, 
        parametersName = x.Parameters.name,
        parametersPrice = x.Parameters.price, 
        parametersStage = x.Parameters.stage,
        parametersTime = x.Parameters.time, 
        parametersWin = x.Parameters.win
    } ).ToList();

1 Ответ

0 голосов
/ 19 мая 2019

Просто вложите один объект в другой.(Если вы используете EF, возможно, было бы лучше иметь 2 отдельных события: одно для вашего DbSet (без вложенного объекта), а другое как контракт данных JSON.)

public class Event
{
    //.. the rest of your attributes here
    public EventParameters Parameters { get; set; }

}

public class EventParameters
{
    public int? Age { get; set; } // If such parameter may not exist in your JSON, ensure it to be nullable in your POCO.
    public string Country { get; set; }
    public string Gender { get; set; }
}
...