Javascript 格式化要装箱的json数据

Javascript 格式化要装箱的json数据,javascript,jquery,Javascript,Jquery,我从服务器得到一个json响应,如下所示: { "Response": { "FirstName": "John", "LastName": "Smith", "NickNames": { "NameOne": "Johnny", "NameTwo": "JohnS", "NameThree": "Smithy" }, "Success"

我从服务器得到一个json响应,如下所示:

{
    "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,我的更新答案现在处理所有非对象数组。在所有类型的输入上都进行了测试。