如何避免JSON反序列化/序列化过程中的值转换问题
解决JSON序列化/反序列化时保留数值原样的问题
问题根源
默认的JSON序列化/反序列化会把JSON数值转换为.NET的double类型,而double存在精度限制,且序列化时会按其默认格式输出,导致原始数值的科学计数法格式、小数精度被改变。
优雅解决方案:使用LINQ to JSON(JObject/JToken)
Newtonsoft.Json提供的LINQ to JSON API(JObject/JToken)会在解析JSON时保留每个元素的原始结构和数值的原始文本表示,不会自动转换为double类型,完美满足“仅修改指定部分,其余内容完全保留”的需求。
PowerShell示例代码
Add-Type -LiteralPath 'C:\Users\user\Documents\WindowsPowerShell\Modules\newtonsoft.json\1.0.2.201\libs\Newtonsoft.Json.dll' $json = '{ "a": 1.333147768201288e+16, "c": 1684715304.486056 }' # 用JObject.Parse解析JSON,保留原始数值格式 $jObj = [Newtonsoft.Json.Linq.JObject]::Parse($json) # 仅修改需要调整的属性(示例:新增属性d并设置值) $jObj["d"] = 0.0 # 输出序列化结果,完全保留原始未修改部分的格式 $serialized = $jObj.ToString([Newtonsoft.Json.Formatting]::Indented) write-host $serialized
效果说明
- 未修改的属性
a会保持原始的科学计数法格式1.333147768201288e+16 - 未修改的属性
c会保持原始的小数精度1684715304.486056 - 修改/新增的属性可以正常设置,不会影响其他内容的原始格式
补充说明
如果必须使用普通的序列化/反序列化,可以通过配置JsonSerializerSettings的FloatParseHandling为Decimal来提升精度,但这种方式无法保留科学计数法的格式,仅能减少精度丢失,不如LINQ to JSON方案彻底。
内容的提问来源于stack exchange,提问作者MegaBomber
相关产品推荐
相关产品推荐

