如何为此类 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的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Tab 键重新映射到两个点/句点按键

按键映射问题,linux下,帮解答

请问linux下按键映射应该怎么做?

有没有WIN10能用的手柄键盘映射

Android Studio 键盘快捷键

Scala将Collection转换为按键映射的最佳方法是什么?