JsonConvert.DeserializeObject无法自动反序列化字符串为uint怎么办?
JSON字符串转uint反序列化报错的解决方法
你的问题是因为Newtonsoft.Json默认不会自动把字符串类型的数字转换为uint值类型,需要显式添加转换逻辑,以下几种方案可以解决:
方案一:为属性添加自定义转换器
先编写一个字符串转uint的转换器:
public class StringToUIntConverter : JsonConverter<uint> { public override uint ReadJson(JsonReader reader, Type objectType, uint existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.String) { if (uint.TryParse(reader.Value.ToString(), out uint result)) { return result; } throw new JsonSerializationException($"无法将字符串\"{reader.Value}\"转换为uint类型"); } else if (reader.TokenType == JsonToken.Integer) { return Convert.ToUInt32(reader.Value); } throw new JsonSerializationException($"不支持的Token类型:{reader.TokenType}"); } public override void WriteJson(JsonWriter writer, uint value, JsonSerializer serializer) { writer.WriteValue(value.ToString()); } }
然后在实体类的属性上标注该转换器:
public class CustmObj { [JsonProperty("fileNumber")] [JsonConverter(typeof(StringToUIntConverter))] public uint FileNumber { get; set; } }
反序列化时就会自动把字符串"1"转换成uint类型的1。
方案二:通过中间字符串属性转换
如果不想编写转换器,可以添加一个字符串类型的中间属性,再通过只读属性获取uint值:
public class CustmObj { [JsonProperty("fileNumber")] public string FileNumberStr { get; set; } [JsonIgnore] public uint FileNumber => uint.Parse(FileNumberStr); }
这种方式适合只需要反序列化读取值的场景,如果需要将对象序列化为JSON,FileNumber属性会被忽略。
方案三:全局配置转换器
如果多个地方都需要这种字符串转uint的转换,可以全局配置转换器,无需给每个属性单独加特性:
var serializerSettings = new JsonSerializerSettings(); serializerSettings.Converters.Add(new StringToUIntConverter()); CustmObj jFile = JsonConvert.DeserializeObject<CustmObj>(json, serializerSettings);
内容的提问来源于stack exchange,提问作者user2384330
相关产品推荐
相关产品推荐

