谷歌闭包编译器和json

fre*_*hie 11 javascript json google-closure-compiler

我有一个json字符串,我解析,然后用点表示法访问对象的属性.但是,在谷歌闭包编译器中,点符号(MyObject.PropertyName)给出了未定义属性的警告.

目前,我正在使用的解决方案是将我的代码转换为括号表示法(MyObject['PropertyName']).这将删除警告,但也会阻止编译器执行其工作.另一方面,当我写时JSON.stringify(MyObject),服务器接收一个具有可理解的属性名称的字符串.

所以我的问题是在处理运行时反序列化和序列化的json对象时,如何在高级模式下最好地使用google编译器.

Joh*_*ohn 5

你基本上有两个选择:

  1. 使用字符串文字(aka MyJsonObject['PropertyName'])使用对象数组访问这是一个简单的解决方案.
  2. 创建一个描述JSON对象属性的extern文件,然后使用点表示法(aka MyJsonObject.PropertyName).这需要更多维护,但如果您在extern描述中提供类型注释,则允许编译器键入检查属性.


小智 2

如果您要编写的唯一 JavaScript 是访问外部 json,那么它就失去了使用编译器的意义。但是,如果您有少量的 JavaScript,除了将 json 解析为域模型之外,它还可以工作,那么编译器可能会很有用。

在我们的解析器中,我们通过括号表示法访问数据,这样我们就可以正确地获取数据。从那里我们将数据填充到我们自己的模型中,我们使用. 符号上。这些被疯狂地重命名,为我们提供了类型检查和所有这些好处。

编辑>> 对于数据,我使用XHRManager。这是一堂非常好的课。当我从该池中获取数据事件时,我按如下方式处理它。

/**
 * @private
 * @param {goog.events.Event} evt The event recieved from the XhrIo.
 */
mypath.MyClass.prototype.onDataRecieved_ = function(evt) {
  if (evt.type != 'complete') return;
  var xhrIo = evt.target;
  var data = xhrIo.getResponseJson();
  //do somethign!
};
Run Code Online (Sandbox Code Playgroud)

我必须警告你,我的 XHRManager 处理仍然有一些不足之处。我上周才重构了我的代码才开始使用它。

为了解析,我这样做:(这是我的代码库中的一些原始内容,因此请忽略一些丑陋的内容。)

our.class.path.ContestJsonParser.prototype.setContestProperties =
    function(contest, element) {
  contest.setName(element['description']);
  /**
     * @type {!number}
     */
  var timeAsInt = element['startTime'];
  contest.setScheduledStartTime(timeAsInt);
  var clockModel = contest.getClockModel();
  if (goog.isDefAndNotNull(element['period'])) {
    clockModel.setMatchState(element['period']['periodName']);
    clockModel.setStateStartTime(element['period']['periodStartTime']);
  }
  //TODO (Johan) this needs to change today to consider the rest of the stats
  //information
  var stats = element['statistics'];
  if (goog.isObject(stats) && goog.isDefAndNotNull(stats['score'])) {
    var score = stats['score'];
    contest.setMatchScore(score['home'], score['away']);
  } else {
    contest.setMatchScore(undefined, undefined); // clears score.
  }
};
Run Code Online (Sandbox Code Playgroud)