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

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属性:

  1. 首先定义转换器:
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);
    }
}
  1. 给KeyBoardRowBase类加转换器特性:
[JsonConverter(typeof(KeyBoardRowBaseConverter))]
public class KeyBoardRowBase
{
    public string[] characters { get; set; }
}

修改后原有反序列化代码可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:42:02