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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:46:02