You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:17:04