JSON对象 - 元素的排序

时间:2018-01-08 06:20:57

标签: javascript json node.js

我知道对象内部的JSON排序并不重要。但我观察到,根据服务器内部遵循的不同代码路径,公共API中响应中JSON元素的排序会发生变化。我将此视为一个安全漏洞并继续修复它,以便响应始终具有JSON中相同的元素顺序。现在我尝试编写一个测试用例,以便我可以使用请求模块验证两个jsons在mocha中具有相同的排序。我无法安静地掌握如何做到这一点。我最初需要做的是

arrays_equal( Object.keys(res1.body), Object.keys(res2.body))

* arrays_equal是一个自定义实现,用于检查数组是否相等。

这不起作用。

一旦将响应解析为javascript对象,它就会在内部生成一个哈希表,从而丢失所有的排序信息。处理这个问题的最佳方法是什么?

编辑1

这是一个假设的例子

当我以管理员用户身份登录时(来自chrome developer tools,响应字符串), 我的回答是{username:'blah', famous:true}

当我以普通用户身份登录时, 我的回答是{famous:true, username:'blah'}

现在我通过稍微更改代码进行了修复,以便两次登录都返回{username:'blah', famous:true}

现在我需要编写一个测试来验证响应在 json响应字符串中是否具有相同的键顺序。

1 个答案:

答案 0 :(得分:1)

 const sort(a,b) => a.index - b.index;

 const keys = Object.keys(JSON.parse( json1 )),
   map1 = keys.map(key =>  ({key, index: json1.indexOf(key)})).sort(sort),
   map2 = keys.map(key => ({key, index: json2.indexOf(key)})).sort(sort),    
   result = map1.every(({key}, index) => key === map2[index].key});

如果按键有序,您可以检查对象字符串。

相关问题