1
我有我从API得到以下JSON结构:查询使用LINQ查询嵌套对象与加盟
{
"event_instance": [
{
"id": 55551244,
"event_id": 11112,
"name": "Brown Belt Karate Class",
"staff_members": [
{
"id": 12345,
"name": "John Smith"
}
],
"people": [
{
"id": 111,
"name": "Jane Doe"
},
{
"id": 222,
"name": "Josh Smith"
},
{
"id": 333,
"name": "Ben Johnson"
}
],
"visits": [
{
"id": 1234578,
"person_id": 111,
"state": "completed",
"status": "complete"
},
{
"id": 1239865,
"person_id": 222,
"state": "completed",
"status": "complete"
},
{
"id": 1239865,
"person_id": 333,
"state": "canceled",
"status": "cancel"
}
]
}
]
}
我使用JSON.NET反序列化到下面的.NET对象是:
[JsonObjectAttribute("event_instance")]
public class EventInstance
{
[JsonPropertyAttribute("id")]
public int Id { get; set; }
[JsonPropertyAttribute("event_id")]
public int EventId { get; set; }
[JsonPropertyAttribute("name")]
public string Name { get; set; }
[JsonPropertyAttribute("staff_members")]
public List<StaffMember> StaffMembers { get; set; }
[JsonPropertyAttribute("visits")]
public List<Visit> Visits { get; set; }
[JsonPropertyAttribute("people")]
public List<Student> Students { get; set; }
}
[JsonObjectAttribute("staff_members")]
public class StaffMember
{
[JsonPropertyAttribute("id")]
public int Id { get; set; }
[JsonPropertyAttribute("name")]
public string Name { get; set; }
}
[JsonObjectAttribute("people")]
public class People
{
[JsonPropertyAttribute("id")]
public int Id { get; set; }
[JsonPropertyAttribute("name")]
public string Name { get; set; }
}
[JsonObjectAttribute("visits")]
public class Visits
{
[JsonPropertyAttribute("id")]
public int Id { get; set; }
[JsonPropertyAttribute("person_id")]
public int PersonId { get; set; }
[JsonPropertyAttribute("state")]
public string State { get; set; }
[JsonPropertyAttribute("status")]
public string Status { get; set; }
}
我使用下面的代码反序列化:
var event = (EventInstance)JsonConvert.DeserializeObject(json, typeof(EventInstance));
以上工作正常,并给了我上述json结构的精确对象表示。现在我试图查询这个事件对象来过滤/项目到一个新的结构,然后我可以序列化回json并发送到浏览器。我需要返回处于“已完成”状态和“完成”状态的活动的学生列表。正如你所看到的,people数组绑定到访问数组(使用id和person_id)。我想产生以下简单的输出:
- 11112,棕带空手道班,约翰·史密斯,111,李四
- 11112,棕带空手道班,约翰·史密斯,222,约什 - 史密斯
我已经试过这样的事情:
var studentList = from theClass in event
from staff in theClass.StaffMembers
from student in theClass.People
from visits in theClass.Visits
where visits.Status == "complete"
&& visits.State == "completed"
select new
{
event_id = theClass.EventId
class_name = theClass.Name,
instructor_name = staff.Name,
student_id = student.Id,
student_name = student.Name
};
string _data = JsonConvert.SerializeObject(studentList);
当然,这会产生重复的学生姓名。我是linq新手。基本上,我需要加入/绑定人员并访问数组,以便为该ID返回单个学生以及该事件的根数据。任何建议,以更好的方式来做到这一点非常赞赏!
啊,现在是有道理的。 Linq需要一些时间才能习惯。谢谢!! – MattoMK