从 C# 的动态列表创建 JSON 对象

Create JSON object from dynamic list from C#

我有一个二维动态列表如下:

List<dynamic> tableContent = new List<dynamic>();

List<dynamic> rowHeader = new List<dynamic>();
rowHeader.add("First header");
rowHeader.add("Second header");
rowHeader.add("Third header");
tableContent.add(rowHeader);

for (int i = 0; i < 5; i++) {
  List<dynamic> rowContent = new List<dynamic>();
  rowContent.add("1");
  rowContent.add("2");
  rowContent.add("3");
  tableContent.add(rowContent);
}

我的 tableContent 本质上是

"First header", "Second header", "Third header"
"1"           , "2"            , "3"
"1"           , "2"            , "3"
"1"           , "2"            , "3"
"1"           , "2"            , "3"
"1"           , "2"            , "3"

我想把它改成json as

[{"First header":"1","Second header":"2","Third header":"3"}
, {"First header":"1","Second header":"2","Third header":"3"}
, {"First header":"1","Second header":"2","Third header":"3"}
, {"First header":"1","Second header":"2","Third header":"3"}
, {"First header":"1","Second header":"2","Third header":"3"}]

如何在不更改初始 for 循环来创建 tableContent 的情况下执行此操作? (因为我还需要它来做其他事情)。

谢谢

埃科

您的 tableContent not 对您的示例至关重要。您的 tableContent 现在是一个 List<List<string>>,因此它将被序列化为

[["First header","Second header","Third header"],["1","2","3"],["1","2","3"],["1","2","3"],["1","2","3"],["1","2","3"]]

如果您需要保持 for 循环不变,则 write your own custom serializer。如果您不需要保持 for 循环不变,请以正确的方式形成数据。例如:

var tableContent = new List<dynamic>();

for (int i = 0; i < 5; i++)
{
    var rowContent = new Dictionary<dynamic, dynamic>();
    rowContent["First header"] = "1";
    rowContent["Second header"] = "2";
    rowContent["Third header"] = "3";
    tableContent.Add(rowContent);
}

结果为:

[{"First header":"1","Second header":"2","Third header":"3"},{"First header":"1","Second header":"2","Third header":"3"},{"First header":"1","Second header":"2","Third header":"3"},{"First header":"1","Second header":"2","Third header":"3"},{"First header":"1","Second header":"2","Third header":"3"}]

P.S。如果你没有特殊用途,你可以将你的 dynamic 更改为强类型:

var tableContent = new List<Dictionary<string, string>>();

for (int i = 0; i < 5; i++)
{
    var rowContent = new Dictionary<string, string>();
    rowContent["First header"] = "1";
    rowContent["Second header"] = "2";
    rowContent["Third header"] = "3";
    tableContent.Add(rowContent);
}

您可以使用 newtonsoft - Json.NET 构建(和解析)jsons。

它可以以多种方式使用,包括“手动”和使用自动序列化。参见此处:Creating JSON.

下面的代码演示了如何使用“手动”方法在构建当前数据结构的同时构建 json(正如我所了解的您想要做的那样):

using System;
using System.Collections.Generic;
using System.Diagnostics;
using Newtonsoft.Json.Linq;

namespace Test
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<List<string>> tableContent = new List<List<string>>();
            JArray tableJson = new JArray(); // This will be the table json object we will build 

            string[] headerNames = { "First header", "Second header", "Third header" };

            List<string> rowHeader = new List<string>();
            rowHeader.Add(headerNames[0]);
            rowHeader.Add(headerNames[1]);
            rowHeader.Add(headerNames[2]);
            tableContent.Add(rowHeader);

            for (int i = 0; i < 5; i++)
            {
                List<string> rowContent = new List<string>();
                JObject rowJson = new JObject(); // This will be the json for one row

                string[] rowElements = { "1", "2", "3" };
                Debug.Assert(rowElements.Length == headerNames.Length);
                for (int j = 0; j < rowElements.Length; ++j)
                {
                    rowContent.Add(rowElements[j]);
                    rowJson[headerNames[j]] = rowElements[j];   // Add the element to the row json
                }
                tableContent.Add(rowContent);
                tableJson.Add(rowJson); // Add the row json to the table json
            }

            // Here tableJson contains the required json.
            // Convert to string and print:
            string tableJsonString = tableJson.ToString();
            Console.WriteLine(tableJsonString);
        }
    }
}

输出:

[
  {
    "First header": "1",
    "Second header": "2",
    "Third header": "3"
  },
  {
    "First header": "1",
    "Second header": "2",
    "Third header": "3"
  },
  {
    "First header": "1",
    "Second header": "2",
    "Third header": "3"
  },
  {
    "First header": "1",
    "Second header": "2",
    "Third header": "3"
  },
  {
    "First header": "1",
    "Second header": "2",
    "Third header": "3"
  }
]

注意:我将 dynamic 列表更改为具有具体类型,因为这样效率更高。