JSON.parse如何管理'undefined'?

时间:2013-07-15 06:42:46

标签: javascript json

我改变了这个:

function MangaElt(obj) {
  "use strict";
  this.mirror = obj.mirror;
  this.name = obj.name;
  this.url = obj.url;
  if (obj.lastChapterReadURL !== undefined) {
    this.lastChapterReadURL = obj.lastChapterReadURL;
    this.lastChapterReadName = obj.lastChapterReadName;
  } else {
    this.lastChapterReadURL = null;
    this.lastChapterReadName = null;
  }
  this.listChaps = [];
  if (obj.listChaps !== undefined && obj.listChaps !== null && obj.listChaps !== "null") {
    if (!isArray(obj.listChaps)) {
      this.listChaps = JSON.parse(obj.listChaps);
    }
  }
  this.read = 0;
  if (obj.read !== undefined && obj.read !== null && obj.read !== "null") {
    this.read = obj.read;
  }
}

进入这个:

function MangaElt(obj) {
  "use strict";
  this.mirror = obj.mirror;
  this.name = obj.name;
  this.url = obj.url;
  this.lastChapterReadURL = obj.lastChapterReadURL || null;
  this.lastChapterReadName = obj.lastChapterReadName || null;
  this.listChaps = JSON.parse(obj.listChaps) || [];
  this.read = obj.read || 0;
  this.update = obj.update || 1;
}

如您所见,代码现在更具可读性和紧凑性。该片段在正常情况下工作正常。问题是我有时没有obj对象中的所有值,所以,我希望这里和那里有一些undefined。这就是我提问的原因:

  1. 为什么JSON.parseundefined解释为字符串,为undefined提出MDN,“语法错误”?
  2. 那么,如果值是正确的字符串,我应该在解析值之前检查吗?
  3. 不应该是JSON.parse,检查解析后的值是undefined并返回undefined? (这可能会引发争论,所以,如果你认为这样做很好,那就忽略这个问题,或者说我对我的低谷问题是错的)
  4. 如果#2是肯定的,那么只要添加一些有条件的第一个剪断应该就够了,对吧?或者我应该转到调用MangaElt的函数并确保obj.listChaps是一个数组而忘记JSON.parse这里? (This is always an array或字符串中的伪数组,因为这是一个协作项目,有人可能有理由这样做)
  5. 对于可能会问的好奇心,“你得到的错误是什么?”是这样的:

    Error in event handler for 'undefined': Unexpected token u SyntaxError: Unexpected token u
    at Object.parse (native)
    at new MangaElt (chrome-extension://nhjloagockgobfpopemejpgjjechcpfd/js/MangaElt.js:44:25)
    at readManga (chrome-extension://nhjloagockgobfpopemejpgjjechcpfd/js/background.js:410:24)
    at chrome-extension://nhjloagockgobfpopemejpgjjechcpfd/js/background.js:607:9
    at Event.dispatchToListener (event_bindings:356:21)
    at Event.dispatch_ (event_bindings:342:27)
    at Event.dispatch (event_bindings:362:17)
    at miscellaneous_bindings:165:24
    at Event.dispatchToListener (event_bindings:356:21)
    at Event.dispatch_ (event_bindings:342:27) event_bindings:346
    

    编辑:This is what already existing entries looks like,不会产生错误。 This scenario是我的问题的动机。键的类型始终相同,并事先进行测试:

    • name是一个字符串
    • mirror是一个字符串
    • url是一个字符串
    • listChaps是字符串
    • 中的“数组”
    • tsupts是整数
    BTW,obj是一个对象,但我认为几乎不可能错过。此外,这是一个Chrome扩展程序,但我不认为这是相关的。完整的脚本here

2 个答案:

答案 0 :(得分:6)

  1. undefined不是JSON文件中的合法令牌(请参阅www.json.org),也不是JSON.parse
  2. 的可接受参数
  3. 您的代码在语义上与先前版本不同。之前版本中的许多测试比新版本更详尽(并且更不容易出错)
  4. 为什么“重构”该代码,如果按照需要工作?你还没有重构它 - 你已经打破了它。

答案 1 :(得分:5)

undefined不是有效的JSON令牌。将未定义的值转换为JSON时,正确的做法是将其呈现为空。