如何修改C# CSV转JSON代码实现嵌套结构输出?
CSV转嵌套结构JSON的C#改造方案
需求说明
现有C#代码可通过表单上传CSV文件并转换为扁平结构的JSON,需改造为嵌套结构,同时完成以下转换:
- 将
mainContent、refID归入details对象 - 将
SEOpageTitle、SEOdescription、SEOKeywords归入seoSettings对象,其中SEOKeywords需拆分为字符串数组 - 将
alreadyPublished的字符串值转换为布尔类型
现有实现代码
class Article { public string slug; public string contentTypeId; public string contentTypeName; public string name; public string description; public string language; public string alreadyPublished; public string mainContent; public string refID; public string SEOpageTitle; public string SEOdescription; public string SEOKeywords; public static Article FromCsv(string csvLine) { string[] values = csvLine.Split(';'); Article article = new Article(); article.slug = values[0]; article.contentTypeId = values[1]; article.contentTypeName = values[2]; article.name = values[3]; article.description = values[4]; article.language = values[5]; article.alreadyPublished = values[6]; article.mainContent = values[7]; article.refID = values[8]; article.SEOpageTitle = values[16]; article.SEOdescription = values[17]; article.SEOKeywords = values[18]; return article; } } public partial class ArticleImporter : PortalModuleBase { protected void btnUpload_Click(object sender, EventArgs e) { string strFileName; string strFilePath; string strFolder; strFolder = Server.MapPath("./files/"); strFileName = csvUpload.PostedFile.FileName; strFileName = Path.GetFileName(strFileName); if(csvUpload.Value != "") { strFilePath = strFolder + strFileName; List<Article> values = File.ReadAllLines(strFolder + strFileName) .Skip(1) .Select(v => Article.FromCsv(v)) .ToList(); string json = JsonConvert.SerializeObject(values); } } }
当前输出(扁平JSON)
[{ "slug":"slug", "contentTypeId":"12345", "contentTypeName":"Article", "name":"Article Title", "description": "Description", "language":"en-US", "alreadyPublished":"FALSE", "mainContent":"Main Aritcle\\n\\n", "refID":"", "SEOpageTitle":"SEO Title", "SEOdescription":"SEO Description", "SEOKeywords":"test" }]
期望输出(嵌套JSON)
{ "slug": "slug", "contentTypeId":"12345", "contentTypeName": "Article", "name": "Article Title", "description": "Description", "language": "en-US", "alreadyPublished": false, "details": { "mainContent": "Main Aritcle\\n\\n", "refID": "" }, "seoSettings": { "pageTitle": "Title", "description": "Description", "keywords": [ "csv", "importing" ] } }
改造方案
1. 定义嵌套实体类
创建两个嵌套类Details和SeoSettings,修改Article类结构以适配嵌套需求:
public class Details { public string mainContent { get; set; } public string refID { get; set; } } public class SeoSettings { public string pageTitle { get; set; } public string description { get; set; } public List<string> keywords { get; set; } } public class Article { public string slug { get; set; } public string contentTypeId { get; set; } public string contentTypeName { get; set; } public string name { get; set; } public string description { get; set; } public string language { get; set; } public bool alreadyPublished { get; set; } public Details details { get; set; } public SeoSettings seoSettings { get; set; } public static Article FromCsv(string csvLine) { string[] values = csvLine.Split(';'); var article = new Article { slug = values[0], contentTypeId = values[1], contentTypeName = values[2], name = values[3], description = values[4], language = values[5], // 字符串转布尔值,忽略大小写 alreadyPublished = string.Equals(values[6], "TRUE", StringComparison.OrdinalIgnoreCase), // 初始化details对象并赋值 details = new Details { mainContent = values[7], refID = values[8] }, // 初始化seoSettings对象,处理关键词拆分 seoSettings = new SeoSettings { pageTitle = values[16], description = values[17], keywords = string.IsNullOrWhiteSpace(values[18]) ? new List<string>() : values[18].Split(',').Select(k => k.Trim()).ToList() } }; return article; } }
2. 调整上传处理逻辑
补充文件保存步骤(原代码遗漏),序列化后即可得到嵌套结构JSON:
public partial class ArticleImporter : PortalModuleBase { protected void btnUpload_Click(object sender, EventArgs e) { string strFileName; string strFilePath; string strFolder; strFolder = Server.MapPath("./files/"); strFileName = csvUpload.PostedFile.FileName; strFileName = Path.GetFileName(strFileName); if(!string.IsNullOrEmpty(csvUpload.Value)) { strFilePath = Path.Combine(strFolder, strFileName); // 保存上传的CSV文件 csvUpload.PostedFile.SaveAs(strFilePath); List<Article> articles = File.ReadAllLines(strFilePath) .Skip(1) // 跳过表头行 .Select(v => Article.FromCsv(v)) .ToList(); string json = JsonConvert.SerializeObject(articles, Formatting.Indented); // 此处可添加JSON输出/存储逻辑,如写入文件或返回前端 } } }
关键改造点说明
- 新增
Details和SeoSettings类实现字段分组嵌套 - 将
alreadyPublished类型从string改为bool,通过不区分大小写的比较实现转换 - 将
SEOKeywords拆分为List<string>,处理空值避免空引用异常 - 补充文件保存步骤,确保读取的是最新上传的CSV文件
内容的提问来源于stack exchange,提问作者Craigjb
相关产品推荐
相关产品推荐

