如何将含特殊键的JSON对象映射到Stocks类实例?
自定义JSON键名到Stocks类实例的映射方案
问题背景
现有结构固定的JSON数组,需要将其中每个对象转换为自定义Stocks类的实例,要求将JSON中的HS字段映射到类的model属性、__EMPTY映射到quantity、__EMPTY_1映射到type,而非直接保留原JSON的键名。
输入JSON数组
var inputJson = [{ "HS": " ", "__EMPTY": 1, "__EMPTY_1": " Pcs." }, { "HS": " RAS222PCAIBA", "__EMPTY": 1, "__EMPTY_1": " Pcs." }, { "HS": " SRK20CSS-S6/A1.6T", "__EMPTY": -4, "__EMPTY_1": " Pcs." }]
原Stocks类与实现代码
原类定义(直接使用Object.assign导致键名不匹配):
class Stocks { model; quantity; type; constructor(data) { Object.assign(this, data); } }
当前创建实例的代码:
var completeStock = [] ; $.each(inputJson, function( index, value ) { completeStock.push(new Stocks(value)); });
解决方案
方案1:修改Stocks构造函数,直接在内部完成映射
直接在构造函数中手动处理键名映射,还可以顺便做字段清理(比如去除字符串前后空格):
class Stocks { model; quantity; type; constructor(data) { // 映射并清理字段 this.model = data.HS?.trim() || ''; this.quantity = data.__EMPTY; this.type = data.__EMPTY_1?.trim() || ''; } }
创建实例的代码无需大幅修改,用原生map或原jQuery写法都可以:
// 原生JS写法(推荐) const completeStock = inputJson.map(item => new Stocks(item)); // 保留jQuery写法 var completeStock = [] ; $.each(inputJson, function( index, value ) { completeStock.push(new Stocks(value)); });
方案2:单独编写映射函数,保持构造函数简洁
如果希望构造函数只负责接收标准结构的数据,可以先写一个转换函数处理JSON到目标结构的映射:
// 转换函数:将原始JSON对象转为符合Stocks属性的对象 function transformStockData(rawItem) { return { model: rawItem.HS?.trim() || '', quantity: rawItem.__EMPTY, type: rawItem.__EMPTY_1?.trim() || '' }; }
此时Stocks类可以保留原结构,通过转换后的对象创建实例:
class Stocks { model; quantity; type; constructor(data) { Object.assign(this, data); } } // 创建实例 const completeStock = inputJson.map(item => new Stocks(transformStockData(item)));
内容的提问来源于stack exchange,提问作者Mohit H
相关产品推荐
相关产品推荐

