Javascript 将外部JSON分配给变量

Javascript 将外部JSON分配给变量,javascript,json,dojo,assign,Javascript,Json,Dojo,Assign,我正在用JSON中的值填充Dojo Combobox下拉列表。 下面的代码工作得很好(内联JSON) var magicvars={ 标识符:“名称”, 标签:“名称”, 项目:[ {名称:“ZCCN编号1”,标签:“ACCN编号1”}, {名称:“CR_Local_ID”,标签:“CR_Local_ID”} ]}; 但是,当我为JSON指定一个外部文件时,no go,也就是说,下拉列表会填充。 外部文件是standard.txt,如下所示 { identifier: 'name',

我正在用JSON中的值填充Dojo Combobox下拉列表。 下面的代码工作得很好(内联JSON)


var magicvars={
标识符:“名称”,
标签:“名称”,
项目:[
{名称:“ZCCN编号1”,标签:“ACCN编号1”},
{名称:“CR_Local_ID”,标签:“CR_Local_ID”}
]};
但是,当我为JSON指定一个外部文件时,no go,也就是说,下拉列表会填充。 外部文件是standard.txt,如下所示

{
  identifier: 'name',
  label: 'name',
  items: [
  {name: "ZCCN_NO_1", label: "<img width='16px' height='16px' src='http://localhost:3000/static/images/eight_ball_16x16.png'/>ACCN_NO_1"},
  {name: "CR_Local_ID", label:"<img width='16px' height='16px' src='http://localhost:3000/static/images/eight_ball_16x16.png'/>CR_Local_ID"}
 ]};
{
标识符:“名称”,
标签:“名称”,
项目:[
{名称:“ZCCN编号1”,标签:“ACCN编号1”},
{名称:“CR_Local_ID”,标签:“CR_Local_ID”}
]};
我对dojo的HTML调用如下

<div dojoType="dojo.data.ItemFileReadStore" jsId="xvarStore2" url="http://localhost:3000/static/standard.txt">
</div>

内联工作正常,但外部调用不能。如果这是一个补救问题,我深表歉意,但我如何读取外部文件并将其分配给“magicvars”。我只是不想用一堆内嵌的JSON把HTML弄得乱七八糟

任何建议都将不胜感激。
Janie

它不是有效的JSON,因此不会使用大多数
JSON.parse
实现进行解析。尝试引用键名并去掉尾随的分号

在铬上

JSON.parse('{ a: "b" }')
产生

SyntaxError: Unexpected token ILLEGAL
同样

JSON.parse('{ a: "b" };')
但是使用有效的JSON(请注意
“a”
周围的引号)


返回预期结果。

尝试将文件重命名为
standard.json


我猜dojo正在以纯文本字符串的形式读取您的文件,因此没有解析JSON。(正如其他答案所指出的,这是无效的)

BAM!这就是答案!迈克,你是最棒的,非常感谢!这很奇怪,因为ItemFileReadStore使用
dojo.xhret
获取URL内容,然后将其传递给
dojo.fromJson
进行解析
dojo.fromJson
实际上执行
eval
而不是
JSON.parse
。因此,不带引号的属性也应该起作用。。。不过从未尝试过。@Stephen,在
{a:foo}
中,
a
是一个标签,就像在
{a:for(…){…break a;}
中一样。因此,
dojo.fromJson
可能将输入包装在括号中,以强制
eval
将其视为表达式<由于分号的原因,代码>({a:foo};)既不是有效语句,也不是有效表达式。一些使用
eval
的JSON解析器也会使用一些regexp技巧来防止通过JSON进行XSS。这些可能也导致了错误。这是一个很好的观察结果。fromJson会将输入用括号括起来。这是分号,我忽略了。但在这种情况下,即使属性名被引用,JSON.parse也无法正常工作,dojo.fromJson也无法正常工作。OP可能在加入引号后去掉了分号。不。ItemFileReadStore使用
dojo.xhret
获取URL,默认为“json comment optional”类型。文本始终解析为JSON。请参阅下面答案中的注释。JSON文件中的结尾分号是导致错误的原因,而不是未加引号的属性名。当然,应该引用正确的JSON——Dojo内部有一个内部讨论/辩论,是否将xhr调用转换为使用JSON.parse——因此,在2.0版中,不带引号的属性名称可能不再有效。
JSON.parse('{ a: "b" };')
JSON.parse('{ "a": "b" }')