【问题标题】:JSON.stringify, change the case of the keyJSON.stringify,改变key的大小写
【发布时间】:2011-03-30 00:30:05
【问题描述】:

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

var entry = {
  "FirstName": "John",
  "LastName": "Doe",
  ....
};

根据我们的命名约定,大小写是这样的,因为它与 .net 类中的属性名称相匹配。

当更改其中一些属性并传回 json 时,Web 服务现在需要骆驼大小写(同样,根据我们的方法参数命名约定),而不是最初返回的帕斯卡大小写。

var entry = {
  "firstName": "John",
  "lastName": "Doe",
  ....
};

这当然行不通。

我正在使用JSON.stringify 将 json 作为字符串发送回 Web 服务,我正在寻找是否有一种简单的方法可以将密钥更改为驼峰式大小写。但是,看起来我只能使用替换参数来处理该值。

我可以更改类的序列化,但假设这不是一个选项。有什么想法吗?

谢谢。

【问题讨论】:

  • 是否有任何理由不将 JSON 作为与最初返回的对象(无论是结构还是类)完全匹配的复杂类型发送回 Web 服务?这样,方法参数几乎可以随心所欲地调用,而且您不必玩对象属性“重命名”?
  • 修复后端。您的命名约定似乎对您不利,并在命名约定中造成违规行为,这不是命名约定应该做的。

标签: javascript json


【解决方案1】:

您可以在编写之前使用 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;
});

相反,您可以使用 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;
    });

第二个可选参数是一个函数,该函数会在解析过程中创建的每个值或将要写入的每个值都被调用。这些实现只是简单地遍历键并将任何具有大写字母的首字母小写。

http://json.org/js.html 有替换者和恢复者的文档:

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

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

【讨论】:

  • ScottE,Mike 为您提供了用于序列化或反序列化的代码。您可以决定要使用哪种键符号,然后使用适当的操作。如果您使用 jQuery 来执行 ajax 请求,您可以告诉它 dataType 是 'text' 以避免完成反序列化,然后自己进行。
  • 如果value 是一个数组,则value && typeof value === 'object' 条件可能会通过,因此您最好用Array.isArray(value) 对其进行补充。
  • @Ste_95,如果是text == '{ "hasOwnProperty": 0 }'),则不是。
  • 明确地说,跳过数组,if 语句变为if (value && typeof value === 'object' && !Array.isArray(value)) { ... }
  • 只是一个小提示,为了更好地解释你的复活器是如何工作的,引用的文字漏掉了一个小点。还使用空白键在根对象上调用 reviver。 MDN 解释了这一点,但 JSON.org 中引用的文本没有。
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多