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

.NET Core 6.0 C#中如何将JSON字符串转为可迭代对象并筛选数据

问题描述

在.NET Core 6.0的C#项目中,调用接口返回一段非标准JSON字符串(示例含6个独立对象,实际约千个),格式为多个JSON对象用逗号直接分隔(无外层数组包裹)。需要将其转为ResponseJsonNode对象数组,并筛选出满足probability*100 > 50的对象。

已定义实体类:

public class ResponseJsonNode {
    public double probability { get; set; }
    public string tagId { get; set; }
    public string tagName { get; set; }
    public BoundingBox boundingBox { get; set; }
}

public class BoundingBox {
    double left { get; set; }
    double top { get; set; }
    double width { get; set; }
    double height { get; set; }
}

尝试用JsonSerializer.Deserialize<List<ResponseJsonNode>>反序列化时,报错The JSON value could not be converted to System.Collections.Generic.List;用JsonNode.Parse转为JsonArray时,报错System.InvalidOperationException: The node must be of type 'JsonArray'。


问题根源

  1. 接口返回的JSON不是标准数组格式:缺少外层[]包裹,JsonSerializer默认只能识别标准数组结构,直接反序列化为List<T>会失败。
  2. BoundingBox的属性为私有访问级别:System.Text.Json默认无法序列化/反序列化私有属性,会导致该部分数据无法正确映射到实体类。

解决方案

1. 修复实体类属性访问权限

将BoundingBox的属性改为public,确保序列化器能正常读取和写入:

public class BoundingBox {
    public double left { get; set; }
    public double top { get; set; }
    public double width { get; set; }
    public double height { get; set; }
}

2. 修正JSON格式并反序列化

给原始JSON字符串添加外层数组括号,同时处理末尾可能存在的多余逗号,再进行反序列化:

using System.Text.Json;

// 原始接口返回的JSON字符串
string rawJson = "你的接口返回JSON内容";

// 修复JSON格式:添加外层数组括号,移除末尾多余逗号
string validJson = $"[{rawJson.TrimEnd(',')}]";

// 反序列化为对象列表
List<ResponseJsonNode> allNodes = JsonSerializer.Deserialize<List<ResponseJsonNode>>(validJson);

// 筛选符合条件的对象
var filteredNodes = allNodes.Where(node => node.probability * 100 > 50).ToList();

3. 大数据量优化方案(逐对象解析)

如果JSON数据量极大(如上万条),为避免一次性加载全部数据到内存,可采用逐对象解析方式:

using System.Text.Json;
using System.Text;

List<ResponseJsonNode> filteredNodes = new();

// 处理原始JSON,移除末尾多余逗号
byte[] jsonBytes = Encoding.UTF8.GetBytes(rawJson.TrimEnd(','));
Utf8JsonReader reader = new(jsonBytes);

while (reader.Read())
{
    // 仅处理JSON对象的起始标记
    if (reader.TokenType == JsonTokenType.StartObject)
    {
        var node = JsonSerializer.Deserialize<ResponseJsonNode>(ref reader);
        if (node != null && node.probability * 100 > 50)
        {
            filteredNodes.Add(node);
        }
    }
}

内容的提问来源于stack exchange,提问作者Majkel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:40:54