我有一些包含JSON字符串的HTML。在 on DOM ready 回调中,我有类似这样的内容:
MyObject = JSON.parse($('#TheJsonString').html());
稍后在我的代码中,我写了一些内容:
var SomeVar = MyObject.MyProp1;
然后当我通过Google闭包编译器运行代码时,我收到警告
属性MyProp1从未在MyObject上定义。
如何编写代码以便它不会生成警告?
答案 0 :(得分:15)
删除警告的最简洁方法是定义JSON的结构。这可以使用@type
标记来完成:
/** @type {{MyProp1:string}} */
其中MyProp1
是属性的名称,string
是类型。
Google的Closure编译器将重命名该变量。如果你不想这样,你必须使用引号+括号而不是点符号:
MyObject['MyProp1']
示例:将以下内容粘贴到Closure Compiler:
中// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==
var MyObject;
function x() { // Magic happens at the next line
/** @type {{MyProp1:string}}*/
MyObject = JSON.parse(prompt(''));
}
function afterX() {
var SomeVar = MyObject.MyProp1;
alert(SomeVar);
}
x();
afterX();
输出:
var a;a=JSON.parse(prompt(""));alert(a.a);
答案 1 :(得分:7)
要取消特定功能的此警告,您可以使用@suppress
注释:
/**
* @suppress {missingProperties}
*/
function useJsonObject() { ... }
要全局关闭此警告 ,请使用jscomp_off
编译器标记关闭missingProperties
class of warnings。
答案 2 :(得分:3)
尝试以这种方式访问该媒体资源:
var SomeVar = MyObject['MyProp1'];
答案 3 :(得分:1)
不应将JSON内容作为HTML放在#TheJsonString对象中,而应将其作为实际的javascript放在页面中。如果服务器正在生成页面中的内容,那么服务器就没有理由需要生成您随后解析的HTML。服务器只需在脚本标记内创建一个javascript变量,并将实际的javascript数据结构放入其中。
JSON.parse()
对于解析ajax响应非常有用,但是当服务器可以将完成的javascript放在生成的页面中时,它实际上是不需要的。
答案 4 :(得分:0)
<!DOCTYPE html>
<html>
<head></head>
<body>
<div id="TheJsonString">
{"bindings": "hr", "method":"asd"}
</div>
<script type="text/javascript" src="jquery-1.7.1.min.js"></script>
<script type="text/javascript">
var MyObject = JSON.parse($('#TheJsonString').html());
var SomeVar = MyObject.bindings;
console.log(SomeVar);
</script>
</body>
</html>
我测试了这样,但没有任何警告它工作正常。