更新动态JSON密钥名称

问题描述:

我有一个有趣的情况,我试图围绕我的头。我有权访问JSON输出,其键名是数字,例如_22,_155等。我创建了所有这些键名转换的映射,但我很难找出如何更新json并将原始的键名替换为地图中的键名。更新动态JSON密钥名称

这里是包含真正的字段名我json字符串的示例:

FieldID对应于源json数据,不带下划线。

[ 
{ 
    "FieldID": "7", 
    "FieldName": "Emp ID", 
    "IsSortableInput": "0", 
    "IsFilterableInput": "0", 
    "ViewAlias": "EmpID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "1" 
}, 
{ 
    "FieldID": "3", 
    "FieldName": "QID", 
    "InputTypeID": "1", 
    "FieldPlaceholder": "Enter Employee Name", 
    "IsSortableInput": "1", 
    "IsFilterableInput": "1", 
    "ViewAlias": "QID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "2", 
    "FieldTypeDesc": "PeopleSearch" 
}, 
{ 
    "FieldID": "6", 
    "FieldName": "NTID", 
    "IsSortableInput": "1", 
    "IsFilterableInput": "0", 
    "ViewAlias": "NTID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "3" 
} 

]

我的目标是要遍历源json字符串,找到在地图(定义JSON)键名并重新命名。最终用我的源json数据替换_7Emp ID

来源JSON:

[ 
{ 
    "_3": "Q123", 
    "_7": "E12345" 
}, 
{ 
    "_3": "X123", 
    "_7": "E34567" 
} 
] 

所需的输出是改变的源JSON,把它变成:

[ 
{ 
    "QID": "Q123", 
    "Emp ID": "E12345" 
}, 
{ 
    "QID": "X123", 
    "Emp ID": "E34567" 
} 
] 

我很迷失在何处,即使这种方法开始。不知道密钥名称是否可以重命名,或者是否需要在进程中删除它们等。

寻找解决此问题的一些建议。

+0

我只想重新创建具有正确的名称一个新的JSON文件。 – wvdz

+0

@wvdz - 正确,这实际上是我通过重命名数据所要做的。我没有访问源json直接重命名,我只是有字段的名称和它们对应的。 – SBB

+0

要做到这一点,你所描述的方式基本上必须编写某种自定义JSON解析器。除非你有充分的理由(例如,JSON文件非常庞大,无法存储到RAM中),否则我建议你只需使用内置解析器将其解码为JavaScript数组,然后对其进行操作并在完成时再次解码。 –

您可以构建旧密钥和新密钥的参考,并迭代数组和密钥。然后分配给新的属性并删除旧的属性。

var keynames = [{ FieldID: 7, FieldName: "Emp ID", IsSortableInput: 0, IsFilterableInput: 0, ViewAlias: "EmpID", LogicOperator: "IN", AllowMultipleValues: 1, IsViewable: 1, PrimaryOnly: 0, DisplayOrder: 1 }, { FieldID: 3, FieldName: "QID", InputTypeID: 1, FieldPlaceholder: "Enter Employee Name", IsSortableInput: 1, IsFilterableInput: 1, ViewAlias: "QID", LogicOperator: "IN", AllowMultipleValues: 1, IsViewable: 1, PrimaryOnly: 0, DisplayOrder: 2, FieldTypeDesc: "PeopleSearch" }, { FieldID: 6, FieldName: "NTID", IsSortableInput: 1, IsFilterableInput: 0, ViewAlias: "NTID", LogicOperator: "IN", AllowMultipleValues: 1, IsViewable: 1, PrimaryOnly: 0, DisplayOrder: 3 }], 
 
    source = [{ _3: "Q123", _7: "E12345" }, { _3: "X123", _7: "E34567" }], 
 
    reference = {}; 
 

 
keynames.forEach(function (o) { 
 
    reference['_' + o.FieldID] = o.FieldName; 
 
}); 
 

 
source.forEach(function (o) { 
 
    Object.keys(o).forEach(function (k) { 
 
     o[reference[k]] = o[k]; 
 
     delete o[k]; 
 
    }); 
 
}); 
 

 
console.log(source);
.as-console-wrapper { max-height: 100% !important; top: 0; }

一旦JSON文件已经被解析,我会用:

删除key.name

然后重新创建具有所需的价值的关键,希望这有助于。

var source = [ 
     {"_3": "Q123", "_7": "E12345"}, 
     {"_3": "X123","_7": "E34567"} 
    ], 
    translationTable = [ 
     { 
     "FieldID": "7", 
     "FieldName": "Emp ID", 
     "IsSortableInput": "0", 
     "IsFilterableInput": "0", 
     "ViewAlias": "EmpID", 
     "LogicOperator": "IN", 
     "AllowMultipleValues": "1", 
     "IsViewable": "1", 
     "PrimaryOnly": "0", 
     "DisplayOrder": "1" 
     }, 
     { 
     "FieldID": "3", 
     "FieldName": "QID", 
     "InputTypeID": "1", 
     "FieldPlaceholder": "Enter Employee Name", 
     "IsSortableInput": "1", 
     "IsFilterableInput": "1", 
     "ViewAlias": "QID", 
     "LogicOperator": "IN", 
     "AllowMultipleValues": "1", 
     "IsViewable": "1", 
     "PrimaryOnly": "0", 
     "DisplayOrder": "2", 
     "FieldTypeDesc": "PeopleSearch" 
     }, 
     { 
     "FieldID": "6", 
     "FieldName": "NTID", 
     "IsSortableInput": "1", 
     "IsFilterableInput": "0", 
     "ViewAlias": "NTID", 
     "LogicOperator": "IN", 
     "AllowMultipleValues": "1", 
     "IsViewable": "1", 
     "PrimaryOnly": "0", 
     "DisplayOrder": "3" 
     } 
    ], 
    transform = function transform(source, translationTable) { 
     // first we create a lookup table so we can reference each number directly to the key it will become. 
     var nameMap = translationTable.reduce(function(map, next) { 
      var keyName = '_' + next.FieldID; 
      if (!map[keyName]) map[keyName] = next.FieldName; 
      return map; 
     }, {}); 
     // loop over all the source objects, returning a new object with the correct keys. 
     return source.map(function(obj) { 
      return Object.keys(obj).reduce(function(record, keyName) { 
       record[ nameMap[ keyName ] ] = obj[ keyName ]; 
       return record; 
      }, {}); 
     }); 
    }, 
    result = transform(source, translationTable); 
console.log(JSON.stringify(result)); 

let mapping = [ 
{ 
    "FieldID": "7", 
    "FieldName": "Emp ID", 
    "IsSortableInput": "0", 
    "IsFilterableInput": "0", 
    "ViewAlias": "EmpID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "1" 
}, 
{ 
    "FieldID": "3", 
    "FieldName": "QID", 
    "InputTypeID": "1", 
    "FieldPlaceholder": "Enter Employee Name", 
    "IsSortableInput": "1", 
    "IsFilterableInput": "1", 
    "ViewAlias": "QID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "2", 
    "FieldTypeDesc": "PeopleSearch" 
}, 
{ 
    "FieldID": "6", 
    "FieldName": "NTID", 
    "IsSortableInput": "1", 
    "IsFilterableInput": "0", 
    "ViewAlias": "NTID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "3" 
} 
]; 

let source = [ 
{ 
    "_3": "Q123", 
    "_7": "E12345" 
}, 
{ 
    "_3": "X123", 
    "_7": "E34567" 
} 
]; 

source.map(ele => { 
    let ret = {}; 
    Object.keys(ele).forEach(key => { 
     let keyNum = key.replace('_',''); 
     let match = mapping.find(ele => { 
      return ele.FieldID === keyNum; 
     }); 
     ret[match.FieldName] = ele[key]; 
    }); 
    return ret; 
});