如何在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
相关产品推荐
相关产品推荐

