将含数组的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




