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

如何将含动态键的JSON数组反序列化为指定C#类?

解决方案

首先修正你的C#类定义(注意属性与类名的匹配,以及JSON键的映射):

public class RootModel 
{
    public string ErrorCode { get; set; }
    public ErrorDetailModel Details { get; set; }
}

public class ErrorDetailModel 
{
    // 匹配JSON中的大写键,根据使用的序列化库选择特性
    public string Message { get; set; }
    public int Code { get; set; } // JSON中CODE是数字类型,用int更合适
}

下面提供两种常用序列化库的实现方式:

方式一:使用Newtonsoft.Json(Json.NET)

  1. 给ErrorDetailModel的属性添加JSON键映射特性:
public class ErrorDetailModel 
{
    [Newtonsoft.Json.JsonProperty("MESSAGE")]
    public string Message { get; set; }
    [Newtonsoft.Json.JsonProperty("CODE")]
    public int Code { get; set; }
}
  1. 先将JSON反序列化为字典列表,再转换为RootModel列表:
string jsonString = "你的JSON内容";

// 反序列化为List<Dictionary<string, ErrorDetailModel>>
var errorDictList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Dictionary<string, ErrorDetailModel>>>(jsonString);

// 转换为目标RootModel列表
var rootModelList = errorDictList.Select(dict => new RootModel
{
    ErrorCode = dict.Keys.First(), // 每个字典只有一个键,直接取第一个
    Details = dict.Values.First()
}).ToList();

方式二:使用System.Text.Json(.NET Core/.NET 5+内置库)

  1. 给ErrorDetailModel的属性添加JSON键映射特性:
public class ErrorDetailModel 
{
    [System.Text.Json.Serialization.JsonPropertyName("MESSAGE")]
    public string Message { get; set; }
    [System.Text.Json.Serialization.JsonPropertyName("CODE")]
    public int Code { get; set; }
}
  1. 反序列化并转换:
string jsonString = "你的JSON内容";

var options = new System.Text.Json.JsonSerializerOptions();
// 如果需要忽略大小写匹配,可以设置为true,否则保持默认严格匹配
// options.PropertyNameCaseInsensitive = true;

var errorDictList = System.Text.Json.JsonSerializer.Deserialize<List<Dictionary<string, ErrorDetailModel>>>(jsonString, options);

var rootModelList = errorDictList.Select(dict => new RootModel
{
    ErrorCode = dict.Keys.First(),
    Details = dict.Values.First()
}).ToList();

注意事项

  • 如果你的JSON中CODE值可能存在非数字情况,可将ErrorDetailModel的Code属性改为string类型,转换时用dict.Values.First().Code.ToString()处理。
  • 确保每个JSON数组元素只有一个动态错误码键,否则First()会取第一个键值对,若有多个需根据业务逻辑调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:45:51