You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

将含数组的JSON反序列化为指定C#结构体时为何报错?

可能的错误原因分析

从你给出的JSON和C#结构体代码来看,大概率是以下几个常见问题导致的反序列化失败,一个个给你拆解:

  • 字段类型不匹配(最常见)
    你的JSON里time字段的值是字符串类型(比如"1""2"),如果你的Pixeldata结构体里把time定义成了int类型,很多JSON序列化器(比如System.Text.Json默认配置)会直接抛出类型转换错误。因为字符串和整数是不同的JSON类型,严格模式下不会自动转换。

    举个错误示例:

    public struct Pixeldata {
        public int time; // 这里是int,但JSON里是字符串"1"
        public string colour;
    }
    

    解决办法要么把time改成string类型,要么配置序列化器允许类型转换(比如System.Text.Json里用JsonSerializerOptions设置NumberHandling = JsonNumberHandling.AllowReadingFromString)。

  • 结构体缺少可访问的无参构造函数
    C#结构体默认有隐式的无参构造函数,但如果你给Pixeldata或者Display结构体手动定义了带参数的构造函数,就会覆盖这个隐式构造函数。而大部分JSON序列化器(比如Newtonsoft.Json、System.Text.Json)在反序列化结构体时,需要无参构造函数来创建实例,这时候就会抛出找不到合适构造函数的错误。

    举个错误示例:

    public struct Pixeldata {
        public Pixeldata(int time, string colour) {
            this.time = time;
            this.colour = colour;
        }
        public int time;
        public string colour;
    }
    

    解决办法是要么去掉自定义构造函数,要么给序列化器配置允许使用非公共构造函数(结构体的无参构造函数在C#里有语法限制,优先依赖隐式构造更稳妥)。

  • 序列化器配置问题(针对System.Text.Json)
    如果你用的是.NET Core/.NET 5+的System.Text.Json,默认情况下它不支持反序列化不可变结构体。如果你的Pixeldata字段是只读的(比如加了readonly修饰符),或者没有开启对应的配置,就会报错。

    解决办法是创建JsonSerializerOptions并调整配置:

    var options = new JsonSerializerOptions {
        AllowReadOnlyProperties = true
    };
    var display = JsonSerializer.Deserialize<Display>(json, options);
    
  • 列表字段未初始化(少见但可能)
    虽然你的Display结构体里定义了public List<Pixeldata> pixeldata;,但如果用了某些老旧的序列化库,可能无法自动初始化这个列表,导致空引用或者初始化错误。可以试试在结构体里直接初始化列表:

    public struct Display {
        public int id;
        public string name;
        public List<Pixeldata> pixeldata = new List<Pixeldata>();
    }
    

如果能提供具体的错误提示信息,还能更精准地定位问题,但从目前的代码来看,上面几个是最可能的诱因。

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

火山引擎 最新活动