Rest API JSON反序列化错误及道路名称查询功能问题排查
解决JSON反序列化错误并实现道路名称筛选功能
问题根源
你的JSON文件采用JSON Lines格式(每行一个独立JSON对象),而非标准的JSON数组(需用[]包裹所有元素),直接反序列化成List<SearchAllRoadNames>会触发序列化异常。同时当前API的返回逻辑存在错误——仅会返回最后一条匹配记录,而非所有符合条件的结果。
修复方案
1. 修正JSON反序列化逻辑
逐行读取JSON文件,对每行单独执行反序列化,再将有效对象收集到列表中,适配JSON Lines格式的结构。
2. 修复API返回与筛选逻辑
将接口返回类型改为IEnumerable<SearchAllRoadNames>,直接返回所有筛选结果;同时处理roadName的尾部空格问题(示例中roadName包含大量冗余空格),确保匹配逻辑准确。
修改后的控制器代码
using John_Høeg_opgave_4._1.Models; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using System.Collections.Generic; using System.IO; using System.Linq; namespace John_Høeg_opgave_4._1.Controllers { [Route("api/[controller]")] [ApiController] public class RoadNamesController : ControllerBase { [HttpGet] public IEnumerable<SearchAllRoadNames> Get(string value) { var jsonFilePath = @"C:\Users\Saphy\OneDrive\Softwareudvikling\SystemIntegration\John Høeg opgave 4.1\path.json"; // 逐行读取并反序列化,适配JSON Lines格式 var jsonList = new List<SearchAllRoadNames>(); foreach (var line in File.ReadLines(jsonFilePath)) { if (string.IsNullOrWhiteSpace(line)) continue; var roadObj = JsonConvert.DeserializeObject<SearchAllRoadNames>(line); if (roadObj != null) jsonList.Add(roadObj); } // 执行筛选:type为001,且roadName去空格后匹配输入前缀 string searchType = "001"; var filteredList = jsonList .Where(x => x.type == searchType && !string.IsNullOrWhiteSpace(x.roadName) && x.roadName.Trim().StartsWith(value.Trim(), System.StringComparison.OrdinalIgnoreCase)) .ToList(); return filteredList; } } }
关键修改说明
- 用
File.ReadLines逐行读取文件,避免一次性加载大文件占用过多内存 - 跳过空行,防止反序列化空字符串报错
- 调整返回类型为
IEnumerable<SearchAllRoadNames>,返回所有匹配结果 - 对
roadName和输入值value执行Trim(),处理冗余空格导致的匹配失败 - 可选使用
StringComparison.OrdinalIgnoreCase实现不区分大小写的匹配,可根据需求移除
内容的提问来源于stack exchange,提问作者Selena
相关产品推荐
相关产品推荐

