Javascript 格式化要装箱的json数据
我从服务器得到一个json响应,如下所示:Javascript 格式化要装箱的json数据,javascript,jquery,Javascript,Jquery,我从服务器得到一个json响应,如下所示: { "Response": { "FirstName": "John", "LastName": "Smith", "NickNames": { "NameOne": "Johnny", "NameTwo": "JohnS", "NameThree": "Smithy" }, "Success"
{
"Response": {
"FirstName": "John",
"LastName": "Smith",
"NickNames": {
"NameOne": "Johnny",
"NameTwo": "JohnS",
"NameThree": "Smithy"
},
"Success": true,
"Errors": []
}
}
是否有一种方法可以通过函数运行此响应,以便对每个键值对的键进行大小写
因此,输出将类似于:
{
"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 (/^[A-Z]/.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);
有关其工作原理的更多信息。用户“@I Hate Lazy”建议的方法——使用“reviver”函数——是正确的。然而,他的功能对我不起作用 可能是因为我正在解析一个JSON数组。我还使用了,它抱怨代码气味:)(“并非所有代码路径都返回值”)。因此,我最终使用了一个函数,对我有用:
function camelCaseReviver(key, value) {
if (value && typeof value === 'object') {
for (var k in value) {
if (/^[A-Z]/.test(k) && Object.hasOwnProperty.call(value, k)) {
value[k.charAt(0).toLowerCase() + k.substring(1)] = value[k];
delete value[k];
}
}
}
return value;
}
这里是一个函数递归(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
}, {})
[有权发表评论,但没有评论权限:(](不过,在一般情况下,您需要小心创建同义词。)用正则表达式解析它是有问题的,可能您最好将其转换为一个对象,然后创建一个新对象并更改属性名称以小写字母开头,然后将其转换回JSON(如果需要的话)或只使用新对象,对象属性没有名称的可能性有多大?@RobG:对于数据结构本身来说可能最小,但恢复程序将始终将最外层的对象结构表示为具有键
的恢复程序中的val
“”
。因此,如果我没有使用else返回val;
进行测试,JSON.parse
的结果将是未定义的
@RobG:No,我的意思是当键
为时
,我需要确保返回val
。如果您不从reviser函数返回值,JSON.parse
将从结果中删除该键/值对。因此,由于顶级对象的默认键为“”
,如果我不返回该对象,JSON.parse
将假定我们不想在解析中包含该对象。而且由于它是最外层的对象,因此没有任何东西可以让JSON.parse
返回,但是未定义的
…请注意,当满足条件时,我的恢复程序不会返回任何值。这是因为如果我当时返回val;
,我们最终会得到一个包含两个版本的键的对象。@1:你的JSON无效。你在{“妻子”:…
之前缺少一个属性名。它应该类似于家庭:{“妻子”:…
。我必须删除整个“年龄”:“12”
行,因为其中包含一些无效的不可见字符,并且在结尾附近有一个额外的]
。在修复JSON后,它将被删除。用于验证JSON数据此操作已关闭,但在非对象数组上失败。应将其更改为:返回(typeof o!='object')?o:object.keys(o)。reduce(…)
@ThePants,讽刺的是,我昨晚正在处理这个问题。更新这个以保持空/未定义并支持数组输入。它仍然假设您的输入是数组或对象。谢谢@A.X.Z,我的更新答案现在处理所有非对象数组。在所有类型的输入上都进行了测试。