更新动态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数据替换_7
与Emp ID
。
来源JSON:
[
{
"_3": "Q123",
"_7": "E12345"
},
{
"_3": "X123",
"_7": "E34567"
}
]
所需的输出是改变的源JSON,把它变成:
[
{
"QID": "Q123",
"Emp ID": "E12345"
},
{
"QID": "X123",
"Emp ID": "E34567"
}
]
我很迷失在何处,即使这种方法开始。不知道密钥名称是否可以重命名,或者是否需要在进程中删除它们等。
寻找解决此问题的一些建议。
答
您可以构建旧密钥和新密钥的参考,并迭代数组和密钥。然后分配给新的属性并删除旧的属性。
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;
});
我只想重新创建具有正确的名称一个新的JSON文件。 – wvdz
@wvdz - 正确,这实际上是我通过重命名数据所要做的。我没有访问源json直接重命名,我只是有字段的名称和它们对应的。 – SBB
要做到这一点,你所描述的方式基本上必须编写某种自定义JSON解析器。除非你有充分的理由(例如,JSON文件非常庞大,无法存储到RAM中),否则我建议你只需使用内置解析器将其解码为JavaScript数组,然后对其进行操作并在完成时再次解码。 –