.NET C#中使用Newtonsoft JSON反序列化非数组JSON对象列表遇阻
解决.NET C#中Newtonsoft JSON处理非标准多对象JSON的问题
针对供应商API返回的无数组包裹、无逗号分隔的多个JSON对象,以及其他非标准格式问题,提供两种可靠解决方案:
方案1:字符串预处理转换为标准JSON数组
如果API返回内容已读取为字符串,可通过简单预处理将其转为合法JSON数组,再进行常规反序列化:
using Newtonsoft.Json; using System.Text.RegularExpressions; // 示例非标准JSON字符串 string rawJson = @"{""Id"":1,""Name"":""GoodsA""}{""Id"":2,""Name"":""GoodsB""}"; // 替换对象间的边界为逗号,包裹为数组 // 若JSON存在嵌套对象,需调整正则(例如匹配完整的{}对) string validJson = "[" + Regex.Replace(rawJson, @"}\s*{", "},{") + "]"; // 反序列化并配置非标准兼容项 List<YourBusinessModel> dataList = JsonConvert.DeserializeObject<List<YourBusinessModel>>(validJson, new JsonSerializerSettings { AllowTrailingCommas = true, MissingMemberHandling = MissingMemberHandling.Ignore });
注意:该方案适合JSON结构简单、无多层嵌套的场景,复杂嵌套JSON推荐方案2。
方案2:用JsonTextReader逐对象解析(推荐)
利用Newtonsoft的JsonTextReader原生支持多内容读取的特性,无需预处理即可逐个解析JSON对象,适配复杂非标准场景:
using Newtonsoft.Json; using System.IO; List<YourBusinessModel> dataList = new List<YourBusinessModel>(); string rawJson = "你的API返回字符串"; // 若数据源是字符串用StringReader,若为流则用StreamReader(你提到StreamReader方案不适用时,替换为对应TextReader实现即可) using (TextReader textReader = new StringReader(rawJson)) using (JsonTextReader jsonReader = new JsonTextReader(textReader)) { // 开启多内容支持,核心配置 jsonReader.SupportMultipleContent = true; JsonSerializer serializer = new JsonSerializer { // 适配其他非标准情况 AllowTrailingCommas = true, MissingMemberHandling = MissingMemberHandling.Ignore }; // 循环读取每个JSON对象 while (jsonReader.Read()) { if (jsonReader.TokenType == JsonToken.StartObject) { YourBusinessModel model = serializer.Deserialize<YourBusinessModel>(jsonReader); dataList.Add(model); } } }
如果StreamReader方案不适用(比如数据源不是流),只需将TextReader替换为对应实现即可(如内存字符串用StringReader,自定义数据源实现TextReader抽象类)。
适配其他非标准格式
若API还存在属性名无引号、单引号代替双引号等问题,可补充以下配置:
- 允许单引号作为引号:
jsonReader.QuoteChar = '\''; - 允许无引号的属性名:
jsonReader.PropertyNameHandling = PropertyNameHandling.AllowUnquoted;
内容的提问来源于stack exchange,提问作者bandworthy
相关产品推荐
相关产品推荐

