C# Asp.Net中linq的扁平化和重构
我想用行程列表重构原始的json数据,并使用Linq基于登机点和下降点返回一个转换后的扁平列表。下面是原始json数据的示例和我想要的结果。我该怎么做?请帮忙。谢谢 原始Json:C# Asp.Net中linq的扁平化和重构,c#,asp.net,json,linq,C#,Asp.net,Json,Linq,我想用行程列表重构原始的json数据,并使用Linq基于登机点和下降点返回一个转换后的扁平列表。下面是原始json数据的示例和我想要的结果。我该怎么做?请帮忙。谢谢 原始Json: [{ tripId: 1, name: "abc express", boardingTimes: [ { time: 1200, id: 12, name: "A" }, { time
[{
tripId: 1,
name: "abc express",
boardingTimes: [
{
time: 1200,
id: 12,
name: "A"
},
{
time: 1215,
id: 14,
name: "B"
}
],
droppingTimes: [{
time: 1400,
id: 15,
name: "C"
}]
}]
结果:
[{
tripId: 1,
name: "abc express",
boardingTimes:
{
time: 1200,
id: 12,
name: "A"
},
droppingTimes: {
time: 1400,
id: 15,
name: "C"
}
},
tripId: 1,
name: "abc express",
boardingTimes:
{
time: 1215,
id: 14,
name: "B"
},
droppingTimes: {
time: 1400,
id: 15,
name: "C"
}
]
您可以使用,它是以下内容的一部分:
小提琴:谢谢,布莱恩·罗杰斯。你的解决方案解决了我的问题。但是,我不明白为什么
bt=>1
和dt=>1
会得到正确的登机时间和降落时间?1代表什么?在Join
方法中,第二个和第三个参数是lambda函数,用于检索我们要在两个相应列表中加入的对象的键。因此,例如,如果我们想将boardingTime.id
与droppingTime.id
匹配,我们将分别使用bt=>bt.id
和dt=>dt.id
lambda函数。但在这种情况下,没有可匹配的键;这些ID彼此不对应。相反,我们希望将每次旅行中的所有登机时间与所有下车时间相匹配。因此,我刚刚让lambda函数返回一个“键”,无论发生什么情况,它都将始终匹配,即1。我当时被卡住了,尝试了几次使用linq,但到目前为止,没有任何结果是有用的。
JArray trips = JArray.Parse(originalJson);
JArray pairs = new JArray(trips
.Select(trip =>
new JArray(trip["boardingTimes"]
.Join(trip["droppingTimes"], bt => 1, dt => 1, (bt, dt) =>
new JObject(
new JProperty("tripId", trip["tripId"]),
new JProperty("name", trip["name"]),
new JProperty("boardingTimes", bt),
new JProperty("droppingTimes", dt)
)
)
)
)
.SelectMany(a => a)
);
string flattenedJson = pairs.ToString();