JSON.NET中JToken的键是否区分大小写?自定义反序列化遇问题
解决JToken键值区分大小写导致取值为null的问题
你遇到的这个问题确实是JSON.NET中JToken默认对键名区分大小写导致的——哪怕JSON里的字段只是大小写和你代码里的不一样(比如JSON里是"Version"或者"VERSION"),用token["version"]去取值都会返回null。下面给你两种实用的解决办法:
方法一:单个键不区分大小写访问
使用SelectToken方法并指定忽略大小写的比较规则,这样就能精准定位到目标字段,不管它的大小写是什么样的:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JToken token = JToken.Load(reader); // 使用SelectToken并指定忽略大小写 JToken version = token.SelectToken("version", StringComparison.OrdinalIgnoreCase); string ver = version.ToObject<string>(); return new MyVersion(ver); }
方法二:全局设置JToken加载时忽略大小写
如果你的场景里需要对整个JToken的所有键都忽略大小写,可以在加载JToken的时候传入JsonLoadSettings配置:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 配置加载时忽略键名大小写 JsonLoadSettings loadSettings = new JsonLoadSettings { PropertyNameCaseInsensitive = true }; JToken token = JToken.Load(reader, loadSettings); JToken version = token["version"]; // 现在这里会自动忽略大小写匹配 string ver = version.ToObject<string>(); return new MyVersion(ver); }
两种方法都能解决你的问题,你可以根据实际场景选择:如果只是个别键需要忽略大小写,用方法一更灵活;如果整个JSON结构都需要不区分大小写处理,方法二更省心。
内容的提问来源于stack exchange,提问作者mhaken
相关产品推荐
相关产品推荐

