我正在向使用以下格式(列表列表)的API发出POST请求.

var data = "{\"Coord\" : [[50.452603, 30.522025],[30.621929, 31.012975]]}";

我有一个.csv文件,其中有一个LAT和LNG列,我想将其转换为上面的JSON格式.

Lat Lng
50.452603 30.522025
30.621929 31.012975

下面是我的代码的一个例子,但它是一个词典列表.我不确定如何调整这一点来创建上述内容.

WorkBook workbook = WorkBook.LoadCSV("C:\\local\\Test\\Test.csv", fileFormat: ExcelFileFormat.XLSX, listDelimiter: ",");
WorkSheet ws = workbook.DefaultWorkSheet;
DataTable dt = ws.ToDataTable(true);

List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
    row = new Dictionary<string, object>();
    foreach (DataColumn col in dt.Columns)
    {
        row.Add(col.ColumnName, dr[col]);
    }
    rows.Add(row);
    string json = JsonConvert.SerializeObject(rows);
    Console.WriteLine(json);
}

推荐答案

json也与数组列表兼容,我认为这在这里更有意义.我们还可以做一些其他的改进.从这个开始,它使用Microsoft.VisualBasic.FileIO命名空间(NuGet上有更好的csv解析器,但这是内置的):

IEnumerable<string[]> ReadCSV(string path)
{
    using (var parser = new TextFieldParser(path))
    {
        parser.Delimiters = new string[] { "," };

        parser.ReadFields(); // read past the header
        while (!parser.EndOfData)
        {
            yield return parser.ReadFields();
        }
    }
}

然后有一节这样的课:

class JsonCoordHelper {
    public IEnumerable<string[]> Coord {get;set;}
}

我们可以这样使用它们:

var data = new JsonCoordHelper();
data.Coord = ReadCSV(@"C:\local\Test\Test.csv");
var result = JsonConvert.SerializeObject(data);

点击此处查看:

https://dotnetfiddle.net/KAdjFK

注意,我使用的是string[]而不是double[]或类似的值,因为无论如何,这些值在json文件中都会以字符串的形式结束.然而,这确实留下了一些额外的引号.如果您需要在自己的程序中对数据进行进一步处理,或者如果那些引号很重要,您可能希望将值解析为double:

class JsonCoordHelper {
    public IEnumerable<double[]> Coord {get;set;}
}

// ...
data.Coord = ReadCSV(@"C:\local\Test\Test.csv").
                Select(r => r.Select(c => double.Parse(c)).ToArray() );

但是,除非需要,否则不要执行上面的操作,因为这是大量额外的数组分配,而且由于国际化/文化问题,从字符串中解析数字并不像我们认为的那样高效或简单.

Csharp相关问答推荐

需要更改哪些内容才能修复被覆盖的财产中的无效警告CS 8765?

我可以 suppress 规则CS 9035一次吗?

以自动方式注销Azure身份应用程序

如何使用CsvReader获取给定列索引的列标题?

Microsoft. VisualBasic. FileIO. FileSystem. MoveFile()对话框有错误?

如何修改中间件或其注册以正确使用作用域服务?

AsNoTrackingWithIdentitySolutions()似乎不起作用?

从应用程序图API调用访问所有者字段

为具有实体框架后端的Reaction项目 Select 正确的Visual Studio模板

Unix上的.NET(核心):.NET意外地未看到通过P/Invoke系统调用对环境变量进行的进程内修改

是否由DI容器自动处理由ActivatorUilties.CreateInstance()创建的服务?

try 链接被委派者(多播委托)时,无法将获取运算符应用于类型为';方法组&39;和方法组';的操作数

GODOT 4向C#中的字符串参数发送信号以等待

在使用UserManager时,如何包含与其他实体的关系?

ASP.NET Core 8 Web API:如何添加版本控制?

使用本地公共PEM文件加密字符串,使用Azure KayVault中的私钥解密

.NET文档对继承的困惑

与另一个对象位于同一位置的对象具有不同的变换位置

默认架构不存在EF核心迁移

方法加载时出现类型加载异常