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

如何在JavaScript中实现指定类型的JSON反序列化(如decimaljs类型)?

在JavaScript中实现差异化JSON解析(部分字段为number,部分为decimal.js类型)

C#中的示例效果

在C#里,我们可以通过声明类的字段类型,让JSON反序列化时自动匹配对应类型:

当字段声明为decimal时:

class Data {
    public decimal Amount { get; set; }
}

var json = @"
{
 ""Amount"": 12.78
}
";
var result = JsonConvert.Parse<Data>(json);

此时result.Amount的类型为decimal。

如果把字段类型改为double:

class Data {
    public double Amount { get; set; }
}

var json = @"
{
 ""Amount"": 12.78
}
";
var result = JsonConvert.Parse<Data>(json);

则result.Amount的类型为double。

JavaScript中的实现方案

当然可以实现类似效果,核心是利用JSON.parse的reviver函数,结合decimal.js库来指定字段的解析类型。

步骤1:安装decimal.js

先通过包管理器安装依赖:

npm install decimal.js

步骤2:自定义解析逻辑

假设我们需要把amount字段解析为Decimal类型,count字段保留为原生number,可以这么写:

const Decimal = require('decimal.js');

const jsonStr = `{
  "amount": 12.78,
  "count": 5
}`;

// 自定义reviver函数,指定字段的解析类型
const parsedData = JSON.parse(jsonStr, (key, value) => {
    if (key === 'amount') {
        return new Decimal(value);
    }
    // 其他字段保持原生类型
    return value;
});

console.log(typeof parsedData.count); // 输出: number
console.log(parsedData.amount instanceof Decimal); // 输出: true

进阶:用类声明映射规则

如果需要更结构化的声明(类似C#的类),可以定义一个类,在实例化时手动处理字段类型:

const Decimal = require('decimal.js');

class Data {
    constructor(rawData) {
        this.amount = new Decimal(rawData.amount);
        this.count = rawData.count; // 保留原生number
    }
}

const jsonStr = `{
  "amount": 12.78,
  "count": 5
}`;

const rawObj = JSON.parse(jsonStr);
const result = new Data(rawObj);

console.log(typeof result.count); // number
console.log(result.amount instanceof Decimal); // true

这样就能实现和C#类似的效果:指定部分字段解析为decimal.js的Decimal类型,其余字段保持原生number。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:55:28