.NET Core中JSON转CSV及向Python API传递CSV字符串为文件的实现方案
解决方案:JSON转CSV并传递给Python文件API
一、C#中将JSON字符串转换为CSV字符串
推荐使用CsvHelper + Newtonsoft.Json(或System.Text.Json)处理,这两个是.NET生态中处理CSV和JSON的常用工具,能高效处理格式转换,避免手动拼接CSV的繁琐与错误。
实现步骤:
安装NuGet包:
- Newtonsoft.Json:
Install-Package Newtonsoft.Json - CsvHelper:
Install-Package CsvHelper
- Newtonsoft.Json:
强类型JSON转CSV代码示例(适用于结构固定的JSON):
using Newtonsoft.Json; using CsvHelper; using System.IO; using System.Globalization; using System.Collections.Generic; // 定义与JSON结构匹配的实体类(根据实际JSON调整字段) public class DataItem { public int Id { get; set; } public string Username { get; set; } public string Email { get; set; } public decimal Score { get; set; } } public string JsonToCsv(string jsonString) { // 反序列化JSON为对象列表 var dataList = JsonConvert.DeserializeObject<List<DataItem>>(jsonString); // 生成CSV字符串 using var writer = new StringWriter(); using var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture); csvWriter.WriteRecords(dataList); return writer.ToString(); }动态JSON转CSV代码示例(适用于结构不固定的JSON):
using Newtonsoft.Json; using CsvHelper; using System.IO; using System.Globalization; using System.Collections.Generic; using System.Dynamic; public string DynamicJsonToCsv(string jsonString) { var dynamicData = JsonConvert.DeserializeObject<List<ExpandoObject>>(jsonString); using var writer = new StringWriter(); using var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture); if (dynamicData.Any()) { // 提取表头(从第一个对象的键中获取) var headers = ((IDictionary<string, object>)dynamicData.First()).Keys; foreach (var header in headers) { csvWriter.WriteField(header); } csvWriter.NextRecord(); // 逐行写入数据 foreach (var item in dynamicData) { var itemDict = (IDictionary<string, object>)item; foreach (var header in headers) { csvWriter.WriteField(itemDict.TryGetValue(header, out var value) ? value : null); } csvWriter.NextRecord(); } } return writer.ToString(); }
二、将CSV字符串以文件形式传递给Python API
Python服务通常通过multipart/form-data格式接收文件上传,在C#中可以用HttpClient将CSV字符串包装成文件流,模拟真实的文件上传请求。
实现步骤:
using System.Net.Http; using System.Text; using System.Threading.Tasks; public async Task<string> SendCsvAsFileToPython(string csvString, string apiEndpoint) { using var httpClient = new HttpClient(); using var formContent = new MultipartFormDataContent(); // 将CSV字符串转为字节数组,创建流内容 var csvBytes = Encoding.UTF8.GetBytes(csvString); using var streamContent = new ByteArrayContent(csvBytes); // 设置内容类型为text/csv streamContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/csv"); // 添加到form-data,参数名需与Python服务接收的参数一致(比如Python端用request.files['file'],这里就填"file") formContent.Add(streamContent, "file", "uploaded_data.csv"); // 发送POST请求 var response = await httpClient.PostAsync(apiEndpoint, formContent); response.EnsureSuccessStatusCode(); // 抛出请求失败的异常 // 返回API响应内容 return await response.Content.ReadAsStringAsync(); }
配套Python服务接收示例(Flask框架)
如果需要验证对接逻辑,Python端可以用如下代码接收文件:
from flask import Flask, request import pandas as pd app = Flask(__name__) @app.route('/process-csv', methods=['POST']) def process_csv(): if 'file' not in request.files: return "未检测到文件", 400 file = request.files['file'] # 读取CSV内容 df = pd.read_csv(file) # 这里添加你的业务处理逻辑 return f"成功处理{len(df)}条数据", 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
完整流程调用示例
public async Task RunFullWorkflow(string jsonInput, string pythonApiUrl) { // 1. JSON转CSV字符串 var csvStr = JsonToCsv(jsonInput); // 2. 发送CSV到Python API var apiResponse = await SendCsvAsFileToPython(csvStr, pythonApiUrl); // 3. 处理响应 Console.WriteLine("Python API响应:" + apiResponse); }
内容的提问来源于stack exchange,提问作者Dipayita Basu
相关产品推荐
相关产品推荐

