C#如何将第三方API返回的item[index].key=value纯文本转JSON或C#对象
实现方案
核心思路
按行解析键值对,从键路径中提取数组索引和属性名,动态构建JSON结构,可直接输出JSON或者映射为C#对象,解析逻辑通用,适配不同结构的接口返回。
代码实现(基于Newtonsoft.Json)
using Newtonsoft.Json.Linq; using System.Text.RegularExpressions; public static JToken ParseApiResponse(string rawText) { var jArray = new JArray(); // 匹配item[索引].属性 格式的正则 var regex = new Regex(@"item\[(\d+)\]\.(\w+)", RegexOptions.Compiled); // 按换行拆分所有行,过滤空行 var lines = rawText.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); foreach (var line in lines) { // 仅拆分第一个=,避免值内包含等号出错 var splitIndex = line.IndexOf('='); if (splitIndex < 0) continue; var keyPart = line.Substring(0, splitIndex).Trim(); var valuePart = line.Substring(splitIndex + 1).Trim(); var match = regex.Match(keyPart); if (!match.Success) continue; var index = int.Parse(match.Groups[1].Value); var propName = match.Groups[2].Value; // 数组长度不足则补位 while (jArray.Count <= index) { jArray.Add(new JObject()); } // 给对应对象赋值 (jArray[index] as JObject)[propName] = valuePart; } return jArray; }
使用示例
string rawResponse = "item[0].Name=name\r\nitem[0].Type=type\r\nitem[1].Name=name\r\nitem[1].Type=type"; var result = ParseApiResponse(rawResponse); // 输出JSON string json = result.ToString(); // 转强类型对象,只需要定义对应结构的C#类即可 // List<YourCustomClass> obj = result.ToObject<List<YourCustomClass>>();
代码实现(基于System.Text.Json 原生)
using System.Text.Json.Nodes; using System.Text.RegularExpressions; public static JsonNode ParseApiResponse(string rawText) { var jsonArray = new JsonArray(); var regex = new Regex(@"item\[(\d+)\]\.(\w+)", RegexOptions.Compiled); var lines = rawText.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); foreach (var line in lines) { var splitIndex = line.IndexOf('='); if (splitIndex < 0) continue; var keyPart = line.Substring(0, splitIndex).Trim(); var valuePart = line.Substring(splitIndex + 1).Trim(); var match = regex.Match(keyPart); if (!match.Success) continue; var index = int.Parse(match.Groups[1].Value); var propName = match.Groups[2].Value; while (jsonArray.Count <= index) { jsonArray.Add(new JsonObject()); } jsonArray[index][propName] = valuePart; } return jsonArray; }
扩展说明
- 适配多结构接口:解析逻辑完全通用,不同返回结构的接口仅需要定义对应属性的C#类,调用反序列化方法即可完成映射,不需要修改解析代码
- 特殊场景兼容:如果后续接口返回嵌套属性(如
item[0].ExtInfo.Id=123),仅需要扩展键路径的解析逻辑即可适配 - 类型转换:如果需要把值转为int、bool等类型,可以在赋值前加类型判断逻辑,根据业务需求自行扩展即可
内容的提问来源于stack exchange,提问作者McAuley
相关产品推荐
相关产品推荐

