.NET中错误嵌套JSON的修正与反序列化实现方法
修复格式错误的JSON并反序列化为ReturnObject列表(C# .NET)
问题场景
你获取到的JSON响应存在多层格式问题:首尾被额外的数组括号和双引号包裹,内部JSON还存在过度转义。示例如下:
string JsonOutput = "[\n \" [{\\\"return_type\\\":\\\"FIELD_LIST\\\",\\\"return_value\\\":[{\\\"fieldname\\\":\\\"INVOICE #\\\",...]}]\n]\n";
预期的正确JSON格式应为:
[{"return_type":"FIELD_LIST","return_value":[{"fieldname":"INVOICE #",...]}]
对应的C#实体类定义:
public class ReturnValue { public string fieldname { get; set; } public string fieldvalue { get; set; } public string startoffset { get; set; } public string endoffset { get; set; } } public class ReturnObject { public string return_type { get; set; } public List<ReturnValue> return_value { get; set; } }
解决方案
步骤1:清理错误的JSON字符串
需要逐层剥离无效包裹并修正转义:
- 移除首尾的空白字符(包括换行符)
- 去掉最外层的数组括号
[和] - 移除内部包裹的首尾双引号
- 替换过度转义的字符(将
\\\"替换为\")
代码实现:
string rawJson = "[\n \" [{\\\"return_type\\\":\\\"FIELD_LIST\\\",\\\"return_value\\\":[{\\\"fieldname\\\":\\\"INVOICE #\\\",\\\"fieldvalue\\\":\\\"12345\\\",\\\"startoffset\\\":\\\"0\\\",\\\"endoffset\\\":\\\"10\\\"}]}]\n]\n"; // 1. 移除首尾空白和换行 string trimmed = rawJson.Trim(); // 2. 去掉最外层的数组括号 string withoutOuterArray = trimmed.Substring(1, trimmed.Length - 2); // 3. 移除首尾引号并修正转义 string cleanedJson = withoutOuterArray.Trim('"').Replace(@"\""", @"""");
步骤2:反序列化为ReturnObject列表
可以使用.NET内置的System.Text.Json或第三方库Newtonsoft.Json完成反序列化:
方式一:使用System.Text.Json(.NET Core 3.0+内置)
using System.Text.Json; var returnObjects = JsonSerializer.Deserialize<List<ReturnObject>>(cleanedJson);
方式二:使用Newtonsoft.Json(Json.NET)
需先通过NuGet安装Newtonsoft.Json包,再执行:
using Newtonsoft.Json; var returnObjects = JsonConvert.DeserializeObject<List<ReturnObject>>(cleanedJson);
完整可运行示例
using System; using System.Collections.Generic; using System.Text.Json; public class ReturnValue { public string fieldname { get; set; } public string fieldvalue { get; set; } public string startoffset { get; set; } public string endoffset { get; set; } } public class ReturnObject { public string return_type { get; set; } public List<ReturnValue> return_value { get; set; } } class Program { static void Main() { string rawJson = "[\n \" [{\\\"return_type\\\":\\\"FIELD_LIST\\\",\\\"return_value\\\":[{\\\"fieldname\\\":\\\"INVOICE #\\\",\\\"fieldvalue\\\":\\\"12345\\\",\\\"startoffset\\\":\\\"0\\\",\\\"endoffset\\\":\\\"10\\\"}]}]\n]\n"; // 清理JSON字符串 string trimmed = rawJson.Trim(); string withoutOuterArray = trimmed.Substring(1, trimmed.Length - 2); string cleanedJson = withoutOuterArray.Trim('"').Replace(@"\""", @""""); // 反序列化 var returnObjects = JsonSerializer.Deserialize<List<ReturnObject>>(cleanedJson); // 验证输出 if (returnObjects != null && returnObjects.Count > 0) { Console.WriteLine($"返回类型:{returnObjects[0].return_type}"); foreach (var val in returnObjects[0].return_value) { Console.WriteLine($"字段名:{val.fieldname},字段值:{val.fieldvalue}"); } } } }
内容的提问来源于stack exchange,提问作者tt0206
相关产品推荐
相关产品推荐

