我知道对象内部的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响应字符串中是否具有相同的键顺序。
答案 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});
如果按键有序,您可以检查对象字符串。