如何在 C# 中将具有子属性的 JSON 反序列化为一个对象
How to deserialize JSON with child attribute into ONE object in C#
我的 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; }
}
那么,我有大约 3000 万条这样的记录,因此如何以有效的方式反序列化它?我正在使用 newtonsoft.json.
编辑:
我最终创建了三个对象(嵌套 Parameters
在 EventNested
中)并按照 Liam 的建议展平 Event
。我随便将 json 反序列化为 EventNested,然后使用这个笨重的 LINQ 表达式将其重新映射为 Event:
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();
只需将一个对象嵌套在另一个对象中。 (如果您使用的是 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; }
}
我的 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; }
}
那么,我有大约 3000 万条这样的记录,因此如何以有效的方式反序列化它?我正在使用 newtonsoft.json.
编辑:
我最终创建了三个对象(嵌套 Parameters
在 EventNested
中)并按照 Liam 的建议展平 Event
。我随便将 json 反序列化为 EventNested,然后使用这个笨重的 LINQ 表达式将其重新映射为 Event:
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();
只需将一个对象嵌套在另一个对象中。 (如果您使用的是 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; }
}