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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:57:01