如何将含动态键的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)
- 给
ErrorDetailModel的属性添加JSON键映射特性:
public class ErrorDetailModel { [Newtonsoft.Json.JsonProperty("MESSAGE")] public string Message { get; set; } [Newtonsoft.Json.JsonProperty("CODE")] public int Code { get; set; } }
- 先将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+内置库)
- 给
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; } }
- 反序列化并转换:
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
相关产品推荐
相关产品推荐

