C# Blazor使用Json.NET反序列化JSON数组出现Cannot deserialize错误求助
问题根因
你的实体类结构和JSON实际结构不匹配:
JSON中每个KeyBoardConfig对应的对象里,rows字段是二维字符串数组,rows下的每一项直接是字符串数组,不是包含characters属性的对象;但你当前定义的KeyBoardConfig.Rows是KeyBoardRowBase类型的数组,相当于多套了一层对象结构,因此反序列化时无法匹配类型触发报错。
解决方案
方案1:修改实体类适配JSON结构(推荐,改动最小)
直接删除KeyBoardRowBase类,将KeyBoardConfig的Rows属性改为二维字符串数组即可:
public class KeyBoardConfig { // 直接用二维字符串数组匹配JSON里的rows结构 public string[][] Rows { get; set; } }
修改后你现有的反序列化代码无需改动,可正常执行。
方案2:保留原有实体类结构,新增JsonConverter转换
如果你出于业务需要必须保留KeyBoardRowBase的结构,可以给KeyBoardRowBase类添加自定义JsonConverter,将JSON里的字符串数组直接映射到characters属性:
- 首先定义转换器:
public class KeyBoardRowBaseConverter : JsonConverter<KeyBoardRowBase> { public override KeyBoardRowBase ReadJson(JsonReader reader, Type objectType, KeyBoardRowBase existingValue, bool hasExistingValue, JsonSerializer serializer) { var chars = serializer.Deserialize<string[]>(reader); return new KeyBoardRowBase { characters = chars }; } public override void WriteJson(JsonWriter writer, KeyBoardRowBase value, JsonSerializer serializer) { serializer.Serialize(writer, value.characters); } }
- 给
KeyBoardRowBase类加转换器特性:
[JsonConverter(typeof(KeyBoardRowBaseConverter))] public class KeyBoardRowBase { public string[] characters { get; set; } }
修改后原有反序列化代码可正常运行。
内容的提问来源于stack exchange,提问作者Lachevre
相关产品推荐
相关产品推荐

