C#中含动态键名的JSON反序列化处理方案咨询
正确处理动态键JSON的反序列化方案
核心思路
你的JSON存在两个动态结构点:
- 顶级键(
IDENTITY/SELFIE)可变,但对应值的结构完全一致 imageReviewResults的键是动态数字字符串,但值的结构统一
直接用强类型字典就能完美解决,比Dictionary<string, object>更安全,无需后续手动类型转换。
修正后的实体类定义
先补全IdentityData的所有字段,尤其是把imageReviewResults定义为字典类型,同时完善对应的子结构类:
// 对应reviewResult和imageReviewResults里的子结构 public class ReviewResultData { [JsonPropertyName("reviewAnswer")] [DataMember(Name = "reviewAnswer")] public string ReviewAnswer { get; set; } } // 对应顶级动态键的值结构 public class IdentityData { [JsonPropertyName("reviewResult")] [DataMember(Name = "reviewResult")] public ReviewResultData ReviewResult { get; set; } [JsonPropertyName("country")] [DataMember(Name = "country")] public string Country { get; set; } [JsonPropertyName("idDocType")] [DataMember(Name = "idDocType")] public string DocType { get; set; } [JsonPropertyName("imageIds")] [DataMember(Name = "imageIds")] public int[] ImageIds { get; set; } [JsonPropertyName("imageReviewResults")] [DataMember(Name = "imageReviewResults")] public Dictionary<string, ReviewResultData> ImageReviewResults { get; set; } [JsonPropertyName("forbidden")] [DataMember(Name = "forbidden")] public bool Forbidden { get; set; } [JsonPropertyName("doubleSided")] [DataMember(Name = "doubleSided")] public bool DoubleSided { get; set; } [JsonPropertyName("stepStatuses")] [DataMember(Name = "stepStatuses")] public object StepStatuses { get; set; } }
反序列化代码
用System.Text.Json(.NET Core/.NET 5+)
直接将JSON字符串反序列化为Dictionary<string, IdentityData>:
string json = "{\"IDENTITY\": {...}}"; // 你的目标JSON字符串 var result = JsonSerializer.Deserialize<Dictionary<string, IdentityData>>(json); // 访问数据示例 foreach (var kvp in result) { string dataType = kvp.Key; // 拿到IDENTITY或SELFIE IdentityData detail = kvp.Value; Console.WriteLine($"数据类型:{dataType},所属国家:{detail.Country}"); foreach (var imageReview in detail.ImageReviewResults) { Console.WriteLine($"图片ID {imageReview.Key} 审核结果:{imageReview.Value.ReviewAnswer}"); } }
用Newtonsoft.Json(Json.NET)
如果使用Newtonsoft库,反序列化逻辑类似,注意属性标签替换为JsonProperty即可:
var result = JsonConvert.DeserializeObject<Dictionary<string, IdentityData>>(json);
关于Dictionary<string, object>的疑问
可以用,但不推荐:
- 用
Dictionary<string, object>反序列化后,需要手动将每个值转换为IdentityData类型,容易出现类型转换错误 - 强类型字典
Dictionary<string, IdentityData>直接完成类型映射,编译期就能发现错误,代码更易维护
内容的提问来源于stack exchange,提问作者Denys TDV
相关产品推荐
相关产品推荐

