Newtonsoft DeserializeObject“真”不区分大小写

Posted

技术标签:

【中文标题】Newtonsoft DeserializeObject“真”不区分大小写【英文标题】:Newtonsoft DeserializeObject "True" Case Insensitive 【发布时间】:2021-12-22 01:57:16 【问题描述】:

我想使用 Newtonsoft.Json.JsonConvert.DeserializeObject 这样的方法将简单的字符串 "True" 反序列化为布尔值 true:

var b = Newtonsoft.Json.JsonConvert.DeserializeObject("True");

但它给了我一个错误。 'Unexpected character encountered while parsing value: T. Path '', line 0, position 0.'

听说Newtonsoft uses case insensitive deserialization by default

为什么会出现这个错误?

【问题讨论】:

为什么不直接使用bool.Parse("True") JSON 通常区分大小写,例如具有两个仅在大小写有效时不同的属性名称。 @Magnus:好吧,这真的令人困惑。删除我之前的评论。 【参考方案1】:

有效的 JSON 值为:

对象 ( ... ) 数组 ([...]) 号码 (1) 字符串 ("String") 布尔值(truefalse,不是 TrueFalse) 空 (null)

因此,“true”是表示单个布尔值的有效 JSON。

但是,"True" 不是有效的 json,它不代表上述任何值根据规范(它不代表字符串,因为在这种情况下它应该是 ""True""(带引号)。

【讨论】:

【参考方案2】:

如前所述,裸露的 True 值根本不是有效的 JSON。所以 JSON.Net 没有理由接受它。

但是,它将接受字符串值 "True""true" 代替 bool

var b = Newtonsoft.Json.JsonConvert.DeserializeObject(@"""True""");

// returns true

var f = Newtonsoft.Json.JsonConvert.DeserializeObject(@"""False""");

// returns false

dotnetfiddle

【讨论】:

以上是关于Newtonsoft DeserializeObject“真”不区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

无法将类型“newtonsoft.json.linq.jtoken”隐式转换为 newt“newtonsoft.json.linq.jvalue”

Newtonsoft.Json,填充字典失败

无法解决“Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”与“Newtonsoft

更新Newtonsoft.Json后报异常,未能加载文件或程序集“Newtonsoft.Json

Newtonsoft.Json

从 JSON 检索项目时获取“无法将 Newtonsoft.Json.Linq.JObject 转换为 Newtonsoft.Json.Linq.JToken”