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

C#读取JSON文件遭遇JsonSerializationException异常求助

问题

读取某特定JSON文件时失败,其他JSON文件可正常读取,排查一小时仍未解决。

代码

List<VFData> visualFieldData;

public class VFData
{
    public double x { get; set; }
    public double y { get; set; }
    public string type { get; set; }
    public double contrast { get; set; }
}

private void LoadVFDataJSONFile(string VFdataFile )
{
    string jsonStream;
    using (StreamReader r = new StreamReader(VFdataFile))
    {
        jsonStream = r.ReadToEnd();
    }
    visualFieldData = JsonConvert.DeserializeObject<List<VFData>>(jsonStream);
}

目标JSON格式(示例)

[
  {
    "x": -4.0,
    "y": 4.0,
    "type": "vf",
    "contrast": 0.670277655
  },
  {
    "x": -14.0,
    "y": 4.0,
    "type": "vf",
    "contrast": 0.407872766
  },
  // 其余条目省略
  {
    "x": -24.0,
    "y": -14.0,
    "type": "vf",
    "contrast": 0.407872945
  }
]

报错信息

Newtonsoft.Json.JsonSerializationException: 无法将当前JSON对象(例如{"name":"value"})反序列化为类型'System.Collections.Generic.List`1[WindowsFormsApp1.Form1+VFData]',因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。
要修复此错误,请将JSON更改为JSON数组(例如[1,2,3]),或者更改反序列化类型,使其成为可以从JSON对象反序列化的普通.NET类型(例如不是整数等基元类型,也不是数组或List等集合类型)。也可以向该类型添加JsonObjectAttribute,强制其从JSON对象反序列化。
Path 'x', line 1, position 5.


解决办法

错误核心:你的代码期望读取JSON数组([...]结构),但实际读到的是单个JSON对象({...}结构)。

别纠结你贴的JSON示例了,那肯定不是你实际读取的文件内容,按下面步骤排查:

  1. 直接打开报错的目标JSON文件,检查开头是否为[、结尾是否为]——大概率不是,可能是单个对象直接以{开头。
  2. 在代码中添加一行输出,确认实际读取到的JSON内容:
private void LoadVFDataJSONFile(string VFdataFile )
{
    string jsonStream;
    using (StreamReader r = new StreamReader(VFdataFile))
    {
        jsonStream = r.ReadToEnd();
    }
    // 打印前100个字符,验证实际内容
    Console.WriteLine("实际读取的JSON开头:" + jsonStream.Substring(0, Math.Min(100, jsonStream.Length)));
    visualFieldData = JsonConvert.DeserializeObject<List<VFData>>(jsonStream);
}
  1. 检查文件路径VFdataFile是否指向了你预期的文件——有可能传错路径读取了其他不符合格式的JSON文件。

如果确认目标文件确实是单个对象结构,修改反序列化代码:

// 先反序列化为单个VFData对象
var singleItem = JsonConvert.DeserializeObject<VFData>(jsonStream);
// 再将其存入List
visualFieldData = new List<VFData> { singleItem };

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:45:34