C#中如何将带分隔符的字符串转换为指定格式的JSON字符串
C# 竖线分隔字符串转目标JSON的实现方法
现有代码的问题根源
之前的拼接逻辑生成的结果不符合要求,主要是三个核心问题:
- 不符合JSON语法规范:标准JSON要求所有键名、字符串类型的字段值必须被双引号包裹,之前的代码既没有给键名加双引号,也没有给字段值加双引号,还在键名前后留了多余空格,生成的内容不是合法JSON
- 字段映射覆盖不全:只拼接了
compCode、accountYear两个字段,没有覆盖剩余6个目标字段 - 输入拆分的细节处理缺失:原始输入字符串末尾自带一个
|分隔符,直接用默认逻辑拆分,会生成包含空字符串的冗余数组,后续取数容易出现错位、空值的问题
正确实现思路
1. 拆分输入的基础处理
拆分时指定移除拆分后产生的空元素,避免末尾分隔符带来的冗余空值:
// 拆分后得到长度为8的有效数组,索引0-7对应所有有效输入值 string[] inputArray = myString.Split('|', StringSplitOptions.RemoveEmptyEntries);
按照你的目标映射规则,数组索引和字段的对应关系为:
- 索引0(值
KTC)→compCode - 索引1(值
2020)→accountYear - 索引2(值
MPD)→shipmentNumber - 索引3(值
18/01/2021)→shipmentDate - 索引4(值
I)→shipmentType - 按业务规则映射值
M→shipmentCategory(注:目标JSON里该字段值为固定的M,和输入数组的第5位值O不一致,属于业务转换规则) - 索引6(值
B)→fromLevelCode - 索引7(值
ALST)→fromLocationCode
2. 两种可选的JSON生成方式
方式A:手动拼接合规JSON(适合简单无特殊字符的场景)
严格按照JSON语法补全所有双引号,不要留多余空格,注意在C#字符串里表示双引号需要用"转义:
string convertedJsonString = "{" + $"\"compCode\":\"{inputArray[0]}\"," + $"\"accountYear\":\"{inputArray[1]}\"," + $"\"shipmentNumber\":\"{inputArray[2]}\"," + $"\"shipmentDate\":\"{inputArray[3]}\"," + $"\"shipmentType\":\"{inputArray[4]}\"," + "\"shipmentCategory\":\"M\"," + $"\"fromLevelCode\":\"{inputArray[6]}\"," + $"\"fromLocationCode\":\"{inputArray[7]}\"" + "}";
方式B:使用内置序列化工具生成JSON(更稳定,推荐生产环境使用)
手动拼接JSON的缺陷是如果字段值包含双引号、换行符等特殊字符,会直接生成非法JSON。更稳妥的方式是定义和目标结构匹配的实体类,赋值后用.NET内置的System.Text.Json序列化,完全避免格式问题:
// 定义匹配目标JSON结构的实体 public class ShipmentPayload { public string compCode { get; set; } public string accountYear { get; set; } public string shipmentNumber { get; set; } public string shipmentDate { get; set; } public string shipmentType { get; set; } public string shipmentCategory { get; set; } public string fromLevelCode { get; set; } public string fromLocationCode { get; set; } } // 赋值业务数据 string[] inputArray = myString.Split('|', StringSplitOptions.RemoveEmptyEntries); var payload = new ShipmentPayload { compCode = inputArray[0], accountYear = inputArray[1], shipmentNumber = inputArray[2], shipmentDate = inputArray[3], shipmentType = inputArray[4], shipmentCategory = "M", fromLevelCode = inputArray[6], fromLocationCode = inputArray[7] }; // 直接序列化得到完全符合规范的JSON字符串 string convertedJsonString = System.Text.Json.JsonSerializer.Serialize(payload);
常见踩坑提醒
- 拼接JSON时不要用无意义的逐字字符串硬拼,很容易漏写转义的双引号
- 拆分带末尾分隔符的字符串时,一定要加上
StringSplitOptions.RemoveEmptyEntries参数,避免空元素导致的索引错位 - JSON语法对格式要求严格,键和字符串值的双引号是强制要求,没有引号的内容会被JSON解析器判定为非法格式
内容的提问来源于stack exchange,提问作者Edwin
相关产品推荐
相关产品推荐

