【问题标题】:Flatten and restructure linq in Asp.Net [closed]在 Asp.Net 中展平和重组 linq [关闭]
【发布时间】:2017-04-14 03:27:41
【问题描述】:

我想用旅行列表重构原始 json 数据并根据登机点返回转换后的扁平化列表落点使用 Linq。下面是原始 json 数据的示例和我想要的结果。我怎么做?请帮忙。谢谢。

原始Json:

[{
     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"
         }
]

【问题讨论】:

  • 当时我被卡住了,使用 linq 尝试了几次,但到目前为止没有任何结果。

标签: c# asp.net json linq


【解决方案1】:

您可以使用LINQ-to-JSON API 来完成,它是Json.Net 的一部分:

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();

小提琴:https://dotnetfiddle.net/VN1AGM

【讨论】:

  • 谢谢,@Brian Rogers。你的解决方案解决了我的问题。但是,我很困惑为什么 bt => 1dt => 1 会得到正确的 boardingTimesdroppingTimes1代表什么?
  • Join 方法中,第二个和第三个参数是 lambda 函数,用于检索我们要在两个相应列表中加入的对象的键。因此,例如,如果我们想将boardingTime.iddroppingTime.id 匹配,我们将分别使用bt => bt.iddt => dt.id lambda 函数。但是在这种情况下,没有要匹配的键; id 彼此不对应。相反,我们希望将每次旅行中的所有登机时间与所有下车时间相匹配。所以,我只是让 lambda 函数返回一个无论如何都会匹配的“键”,即 1。
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 2017-03-27
  • 2018-12-28
  • 2012-12-16
  • 2013-12-12
  • 2018-08-30
  • 2013-07-29
  • 2021-10-16
相关资源
最近更新 更多