将json数据格式化为camelCased

我从服务器得到一个json响应,看起来像这样:

{ "Response": { "FirstName": "John", "LastName": "Smith", "NickNames": { "NameOne": "Johnny", "NameTwo": "JohnS", "NameThree": "Smithy" }, "Success": true, "Errors": [] } } 

有没有办法可以通过函数运行此响应,以便每个键值对的键都是camelCased?

所以输出看起来像:

 { "response": { "firstName": "John", "lastName": "Smith", "nickNames": { "nameOne": "Johnny", "nameTwo": "JohnS", "nameThree": "Smithy" }, "success": true, "errors": [] } } 

如果有人能指出我正确的方向,那就太好了。

谢谢。

您将为JSON.parse一个reviver函数,该函数将值分配给较低属性的新属性。

 function toCamelCase(key, value) { if (value && typeof value === 'object'){ for (var k in value) { if (/^[AZ]/.test(k) && Object.hasOwnProperty.call(value, k)) { value[k.charAt(0).toLowerCase() + k.substring(1)] = value[k]; delete value[k]; } } } return value; } var parsed = JSON.parse(myjson, toCamelCase); 

有关它如何在这个SO答案中工作的更多信息。

用户’@Hate Lazy’建议的方法 – 使用’reviver’function – 是正确的方法。 但是他的function对我不起作用。

也许是因为我正在解析一个JSON数组。 我也使用Resharper并且它抱怨代码味道:)(’并非所有代码路径都返回一个值’)。 所以我最终使用了另一个SO问题的函数,它对我有用:

 function camelCaseReviver(key, value) { if (value && typeof value === 'object') { for (var k in value) { if (/^[AZ]/.test(k) && Object.hasOwnProperty.call(value, k)) { value[k.charAt(0).toLowerCase() + k.substring(1)] = value[k]; delete value[k]; } } } return value; } 

这是一个function递归(ES6)方法。

 function convertKeysToCamelCase(o) { if (o === null || o === undefined) { return o; } else if (Array.isArray(o)) { return o.map(convertKeysToCamelCase); } return typeof o !== 'object' ? o : Object.keys(o).reduce((prev, current) => { const newKey = `${current[0].toLowerCase()}${current.slice(1)}`; if (typeof o[current] === 'object') { prev[newKey] = convertKeysToCamelCase(o[current]); } else { prev[newKey] = o[current]; } return prev; }, {}); } // successfully tested input const o = { SomeNum: 1, SomeStr: 'a', SomeNull: null, SomeUndefined: undefined, SomeBoolean: true, SomeNaN: NaN, NestedObject: { SomeSentence: 'A is for apple', AnotherNested: { B: 'is for blahblah' } }, NumArray: [1, 2, 3, 4], StringArray: ['a', 'b', 'c'], BooleanArray: [true, false], ArrayOfArrays: [[1,2,], ['a','b']], ObjectArray: [{Foo:'bar'}, {Hello:'world', Nested:{In:'deep'}}], MixedArray: [1,'a', true, null, undefined, NaN, [{Foo:'bar'}, 'wat']] } const output = convertKeysToCamelCase(o); console.log(output.mixedArray[6][0].foo); // 'bar' 

@adamjyee除了嵌套的整数数组之外,你的解决方案是有效的。 一个小修复可能是:

 function convertKeysToCamelCase (o) { if (o === null) { return null } else if (o === undefined) { return undefined } else if (typeof o === 'number') { return o } else if (Array.isArray(o)) { return o.map(convertKeysToCamelCase) } return Object.keys(o).reduce((prev, current) => { const newKey = `${current[0].toLowerCase()}${current.slice(1)}` if (typeof o[current] === 'object') { prev[newKey] = convertKeysToCamelCase(o[current]) } else { prev[newKey] = o[current] } return prev }, {}) 

[发表评论但缺乏评论的权利:(]

您需要编写一个遍历树的递归函数,并返回一个新树,其中对象中的键已更新。 递归函数会调用自己来处理它遇到的任何子对象。