C#如何将JSON中十六进制字符串反序列化为int类型
解决方案
错误原因
- 不应该使用
existingValue参数取值:该参数代表目标属性在反序列化开始前已有的默认值,而非JSON中携带的待转换值,JSON当前节点的值需要从reader.Value中读取 - 十六进制转int缺少进制标识:
Convert.ToInt32默认按十进制字符串解析,需要传入第二个参数16指定按照十六进制格式转换
修正后的转换器代码
以下实现适配你当前使用的Newtonsoft.Json(Json.NET)库规范:
using Newtonsoft.Json; public class myConverter : JsonConverter { // 只有目标类型为int时启用该转换器 public override bool CanConvert(Type objectType) { return objectType == typeof(int); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 从JSON读取原始十六进制字符串值 string hexStr = reader.Value?.ToString().Trim(); // 可在此处补充空值、非法字符等校验逻辑 // 指定按16进制转换为int类型 return Convert.ToInt32(hexStr, 16); } // 无需支持序列化写入,直接关闭写入能力 public override bool CanWrite => false; public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotSupportedException("该转换器仅支持读取转换,不支持写入序列化"); } }
验证效果
反序列化你的示例JSON即可得到预期结果:
string json = @" { ""name"" : ""someName"", ""id"" : ""b1"" }"; Person person = JsonConvert.DeserializeObject<Person>(json); // 此时person.id的值为177,符合预期
内容的提问来源于stack exchange,提问作者Angryjames
相关产品推荐
相关产品推荐

