You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 07:47:25