C#使用JsonConvert.DeserializeObject反序列化字符串到string类型失败原因咨询
问题原因解析
底层报错根因
JsonConvert.DeserializeObject方法的输入要求是符合JSON规范的完整字符串,而不是任意普通字符串,这是触发异常的核心原因:
- 你传入
"42"时,该内容本身就是合法的JSON数字字面量,JSON标准中数字无需额外包裹引号,Newtonsoft.Json还内置了宽松类型转换逻辑,因此可以正常解析为int类型。 - 你传入
"true"时,该内容是合法的JSON布尔字面量,同理可以正常解析为bool类型。 - 你传入
"MyString"时,该内容不符合JSON字符串的语法规则:JSON规范要求字符串必须使用双引号包裹,解析器读到首字符M时,无法匹配数字、布尔、null、对象、数组等任何合法JSON值的开头,因此直接抛出非法字符异常。
如果你要直接用
DeserializeObject转字符串,需要把输入内容修改为带双引号的格式,例如JsonConvert.DeserializeObject("\"MyString\"",typeof(string))就可以正常返回结果。
前置类型判断的必要性
你当前拿到的各个值,是从原JSON中读取的属性值的原始文本内容,不是标准的JSON序列化片段:原JSON里字符串类型的属性值外层的引号只是JSON语法标识,读取后会被自动去掉。如果不加判断直接传入DeserializeObject,当目标类型为string时,必然会因为输入不符合JSON字符串语法报错。
提前做类型判断,目标类型为string时直接返回原始值,是不需要修改输入内容、性能开销最低的适配方案,完全合理。
内容的提问来源于stack exchange,提问作者Jeff McAleer
相关产品推荐
相关产品推荐

