如何为此类 API 响应按键映射 json
Posted
技术标签:
【中文标题】如何为此类 API 响应按键映射 json【英文标题】:How to map the json by key for such API response 【发布时间】:2017-12-04 19:23:16 【问题描述】:这就是 API 响应的样子。
"keys": ["CustomerId", "Name", "Gender"],
"value": [["1", "Ram", "Male"]]
角度虚拟机
function Customer()
return this.Customer =
"CustId": "",
"Name": "",
"Gender": "",
Angular AJAX 调用。
$http.get(url)
.then(function(data))
var cust = new Customer();
//for now I am doing this way.
cust.Id = data.value[0][0];
cust.Name = data.value[0][1];
cust.Gender = data.value[0][1];
我不想按索引映射属性。
这些 API 不在我的控制范围内 有什么办法,我可以通过键(作为响应)映射属性,如下所示。
cust.Id = data.value[0]["CustomerId"];
cust.Name = data.value[0]["Name"];
cust.Gender = data.value[0]["Gender"];
非常感谢任何帮助/建议。
【问题讨论】:
您能否修改您的 API 响应以更好地格式化 JSON?这不是一个高质量的结构化响应。 @Brant,希望我能。但这不在我的控制范围内 【参考方案1】:我能看到实现这样的事情的唯一方法是找到每个键的索引,并在访问你的值时使用它作为索引:
$http.get(url)
.then(function(data)
var cust = new Customer();
cust.Id = data.value[0][data.keys.indexOf('CustomerId')];
cust.Name = data.value[0][data.keys.indexOf('Name')];
cust.Gender = data.value[0][data.keys.indexOf('Gender')];
);
但请注意,这仅在键和值匹配时才有效……我认为它们会匹配。
【讨论】:
谢谢!!现在真的很有用,会接受它(让我们看看是否有人有其他方法)【参考方案2】:如果你能够使用 ES6,最好的解决方法(对于这个糟糕的 API)是创建一个这样的解析器函数:
function parseResponse(response)
const keys, value: objects = response;
return objects.map(object =>
const parsedValue = ;
keys.forEach((key, index) =>
parsedValue[key] = object[index];
);
return parsedValue;
);
测试:
const response =
"keys": ["CustomerId", "Name", "Gender"],
"value": [["1", "Ram", "Male"]]
;
parseResponse(response); // Outputs [CustomerId: "1", Name: "Ram", Gender: "Male"]
如果你愿意,我可以用 ES5 来实现。直接说一句话:)
编辑
ES5 版本:
function parseResponse(response)
var keys = response.keys;
var objects = response.value;
var response = [];
for (let i = 0; i < objects.length; i++)
var formattedValue = ;
for (let j = 0; j < keys.length; j++)
var key = keys[j];
formattedValue[key] = objects[i][j];
response.push(formattedValue);
return response;
【讨论】:
谢谢伙计,是的,请务必使用 ES 5,并将其保留在帖子中。 是的,当然。编辑了我的答案:) 请不要忘记投票!以上是关于如何为此类 API 响应按键映射 json的主要内容,如果未能解决你的问题,请参考以下文章