【问题标题】:Newtonsoft DeserializeObject "True" Case InsensitiveNewtonsoft DeserializeObject“真”不区分大小写
【发布时间】: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:好吧,这真的令人困惑。删除我之前的评论。

标签: c# json


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 2021-11-23
      • 2012-12-01
      • 2013-03-06
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多