如何反序列化参数中包含"0"键的JSON响应体到自定义Class
问题核心原因
JSON中data节点下的键为数字开头的字符串"0",而C#语法不允许数字作为属性名的首字符,你定义的_0属性无法和JSON键自动完成映射,因此反序列化失败,可通过以下两种方案解决:
方案1:使用序列化特性显式指定映射键名
适合data下的数字键固定为"0"的场景,通过序列化库提供的特性手动绑定属性和JSON键:
实体类定义示例
// 消息项实体 public class MsgItem { public string MsgID { get; set; } public string Status { get; set; } public string SendTime { get; set; } public string DeliverTime { get; set; } } // 响应头元数据实体 public class ResponseMeta { public int status { get; set; } public string message { get; set; } } // Data节点实体 public class ResponseData { // 使用Newtonsoft.Json(Json.NET)时加此特性 [JsonProperty("0")] // 使用System.Text.Json时替换为下面的特性 // [JsonPropertyName("0")] public MsgItem Item { get; set; } } // 完整响应实体 public class ApiResponse { public ResponseMeta meta { get; set; } public ResponseData data { get; set; } }
配置完成后直接调用对应序列化库的反序列化方法即可完成解析。
方案2:将data节点定义为字典类型(更通用)
适合data下的数字键不固定、可能动态新增"1"/"2"等键的场景,无需额外配置即可兼容:
实体类定义示例
// MsgItem、ResponseMeta类和方案1一致,仅需修改ApiResponse的data属性类型 public class ApiResponse { public ResponseMeta meta { get; set; } // 字典的键对应JSON中的"0"/"1"等字符串数字,值为对应的消息对象 public Dictionary<string, MsgItem> data { get; set; } }
反序列化完成后,通过response.data["0"]即可取出对应对象。
注意事项
- 不要通过加下划线的方式定义属性试图匹配数字键,默认序列化规则不会自动将
_0属性映射为JSON的"0"键。 - 如果data下的键是动态生成的、数量不固定,优先选择字典方案,无需修改实体类即可兼容后续新增的键。
内容的提问来源于stack exchange,提问作者Mousa Ghajar Najafi
相关产品推荐
相关产品推荐

