【问题标题】:How to convert a JSON string into a JavaScript Object including type checking如何将 JSON 字符串转换为 JavaScript 对象,包括类型检查
【发布时间】:2011-10-20 05:03:13
【问题描述】:

对于 Javascript 项目,我将 json 字符串转换为 Javascript 对象。但是由于 JSON 解析,我所有值的类型都是“字符串”。
是否有任何解决方案来识别类型并让脚本将它们转换为正确的 javascript 类型?

例如

//Javascript object for the json decoded string    
var jsonObj = { id: "foo", count: "1" };

所有值都是“字符串”类型,但我希望将计数视为一个数字。是否有解析器来设置正确的类型还是需要在 JS 中手动完成?

【问题讨论】:

  • 嗯。 JSON 类型 是一个字符串。如果您希望将其解析为 JavaScript 数字,为什么不首先让 JSON 有一个数字呢? { id: "foo", count: 1 };
  • 你是不是绝对不能收到没有引号的号码类型?因为这样辛苦的工作就会为你完成......
  • 同样考虑到 Javascript 是松散类型的,如果你在与之交互的代码中将它视为一个数字,“count”将被视为一个数字。 blog.jeremymartin.name/2008/03/…
  • json 字符串来自 yahoo 管道,我可以在其中将输出检索为 JSON,但所有值都是字符串。

标签: javascript types json


【解决方案1】:

您可以通过JSON.parse 使用恢复器。

json2.js 如此描述复活者

JSON.parse(text, reviver)

可选的 reviver 参数是一个可以过滤和 转换结果。它接收每个键和值, 并且使用它的返回值代替原始值。 如果它返回它收到的内容,那么结构不会被修改。 如果返回 undefined 则删除该成员。

所以要将计数转换为您可能会做的数字

JSON.parse(myJsonString, function (key, value) {
  return key === "count" ? +value : value;
});

所以

JSON.stringify(JSON.parse('{ "id": "foo", "count": "3" }', function (key, value) {
  return key === "count" ? +value : value;
}));

生产

{"id":"foo","count":3}

编辑

也可以处理日期,您可以

JSON.parse(myJsonString, function (key, value) {
  // Don't muck with null, objects or arrays.
  if ("object" === typeof value) { return value; }
  if (key === "count") { return +value; }
  // Unpack keys like "expirationDate" whose value is represented as millis since epoch.
  if (/date$/i.test(key)) { return new Date(+value); }
  // Any other rules can go here.
  return value;
});

【讨论】:

  • 一个更通用的复活者将是function(k,v){if(isFinite(+v) return +v; else return v;},但你可能会结束将真正应该是字符串的成员转换为数字。
  • @Prusse,同意。 OP 建议了一个将键名与类型相关联的约定,所以我假设一个,但是当不存在这样的约定时,你的建议是一个很好的建议。由于isFinite(+"9007199254740993") 是真的,它可能不适用于以字符串形式存储的 64 位密钥,但 +"9007199254740993" === 9007199254740992 因为 JavaScript 数字只有 52b 尾数。
  • 这个问题将出现在 javascript 中的任何 64 位数字中,我猜这应该会发生。鉴于此限制,即使 9007199254740993 === 9007199254740992 也会返回 true。
  • @Prusse,我的意思是,除非您需要将数据作为数字进行操作,否则不应执行可能有损的字符串->数字转换。如果您从未将字符串转换为数字,那么您永远不会遇到这个问题。
  • 嗯,很有趣,感谢您的回复。所以实际上我需要手动编写一个函数来检查类型?如果原始数据包含时间或日期,这是否也有效,例如:Thu, 04 Aug 2011 12:59:50 GMT?可能函数会更复杂一些..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2016-10-09
相关资源
最近更新 更多