.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'。
问题根源
- 接口返回的JSON不是标准数组格式:缺少外层
[]包裹,JsonSerializer默认只能识别标准数组结构,直接反序列化为List<T>会失败。 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
相关产品推荐
相关产品推荐

