JSON.stringify,更改密钥的大小写

Sco*_*ttE 19 javascript json

我正在使用一个返回json的web服务,并将json存储在一个局部变量中.json代表一个简单的业务对象,例如:

var entry = {
  "FirstName": "John",
  "LastName": "Doe",
  ....
};
Run Code Online (Sandbox Code Playgroud)

外壳就是这样的,因为根据我们的命名约定,它与.net类中的属性名称匹配.

当更改其中一些属性并传回json时,Web服务现在需要驼峰大小写(再次,根据我们的方法参数的命名约定)而不是最初返回的pascal大小写.

var entry = {
  "firstName": "John",
  "lastName": "Doe",
  ....
};
Run Code Online (Sandbox Code Playgroud)

这当然不起作用.

我正在使用JSON.stringifyjson作为字符串将json发送回Web服务,我正在寻找是否有一种简单的方法可以将密钥更改为camel case.但是,看起来我只能使用replacer参数来处理该值.

我可以改变类的序列化,但是假装这不是一个选项.有任何想法吗?

谢谢.

Mik*_*uel 32

您可以在写入之前使用JSON替换程序切换密钥.

JSON.stringify(myVal, function (key, value) {
  if (value && typeof value === 'object') {
    var replacement = {};
    for (var k in value) {
      if (Object.hasOwnProperty.call(value, k)) {
        replacement[k && k.charAt(0).toLowerCase() + k.substring(1)] = value[k];
      }
    }
    return replacement;
  }
  return value;
});
Run Code Online (Sandbox Code Playgroud)

相反,您可以使用JSON reviver.

JSON.parse(text, function (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;
    });
Run Code Online (Sandbox Code Playgroud)

第二个可选参数是一个函数,该函数使用作为解析的一部分创建的每个值或将要写入的每个值调用.这些实现简单地遍历键和小写的任何具有大写字母的第一个字母.

http://json.org/js.html上有关于替换者和复兴者的文档:

可选的reviver参数是将在最终结果的每个级别为每个键和值调用的函数.每个值都将被reviver函数的结果替换.这可用于将通用对象重构为伪类的实例,或将日期字符串转换为Date对象.

stringifier方法可以采用可选的replacer函数.它将在结构中的每个值上的toJSON方法(如果有)之后调用.它将作为参数传递每个键和值,并且这将绑定到持有该键的对象.返回的值将被字符串化.

  • 如果 `value` 是一个数组,`value && typeof value === 'object'` 条件可能会通过,所以你最好用 `Array.isArray(value)` 补充它。 (2认同)
  • 明确地说,要跳过数组,“if”语句变为“if (value && typeof value === 'object' && !Array.isArray(value)) { ... }” (2认同)