【问题标题】:Combining two adjacent collections to create Json rows组合两个相邻的集合来创建 Json 行
【发布时间】:2017-02-17 16:36:51
【问题描述】:

我有一个List<Dictionary<string, List<string>>>,在使用 NewtonSoft 进行序列化后会给出如下结果:

[{
    "Header1" : [
        "25%",
        "1.4%",
        "0.93%"
    ],
    "Header2" : [
        "51%",
        "42%",
        "16"
    ],
    "Header3" : [
        "8%",
        "99%",
        "11.37%"
    ]
}]

我需要将其转换为带有键值对的数据表,类似于 JSON:

{
    "data":
    [{
        "Header1" : "25%",
        "Header2" : "51%",
        "Header3" : "8%",
    },
    {
        "Header1" : "1.4%",
        "Header2" : "42%",
        "Header3" : "99%",
    }]
}

您能否建议一种无需手动执行foreach 循环即可实现此目的的优雅方法?

请注意 Headers 的值不是静态的;我在运行时获取它们。

【问题讨论】:

    标签: c# .net json linq dynamic


    【解决方案1】:

    你可以使用 Linq 方法做这样的事情:

    var initialData = new List<Dictionary<string, List<string>>>
    {
        new Dictionary<string, List<string>>
        {
            { "Header1", new List<string> {"25%", "1.4%", "0.93%" } },
            { "Header2", new List<string> {"51%", "42%", "16%" } },
            { "Header3", new List<string> {"8%", "99%", "11.37%" } }
        },
    };
    
    var result = new
    {
        data = initialData.First()
                .Select(kvp => kvp.Value.Select((v, i) => 
                               new { Key = kvp.Key, Value = v, Index = i }))
                .SelectMany(a => a)
                .GroupBy(a => a.Index)
                .Select(g => g.ToDictionary(a => a.Key, a => a.Value))
    };
    
    string json = JsonConvert.SerializeObject(result, Formatting.Indented);
    Console.WriteLine(json);
    

    上面的代码会给出这样的输出:

    {
      "data": [
        {
          "Header1": "25%",
          "Header2": "51%",
          "Header3": "8%"
        },
        {
          "Header1": "1.4%",
          "Header2": "42%",
          "Header3": "99%"
        },
        {
          "Header1": "0.93%",
          "Header2": "16%",
          "Header3": "11.37%"
        }
      ]
    }
    

    【讨论】:

    • 对迟到的回复表示歉意。非常感谢!
    • 没问题。如果这回答了您的问题,请不要忘记通过单击答案左侧的复选标记图标将其标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2019-07-14
    • 2021-01-28
    • 2017-12-05
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多