将JSON数组转换为单独的JS变量

5

我有一个JSON数组:

{"a":"apple,"b":"banana","c":"carrot"}

我希望将数组的每个部分拆分为单独的变量,例如,
a = "apple",
b = "banana";
c = "carrot";

我已经用谷歌搜索了很久,但似乎找不到正确的方法来做这件事。我对JSON还不熟悉,虽然已经阅读了相当多的资料,但我想要的东西似乎并没有被提及。

编辑:有些人可能会混淆我的数组是字符串还是对象。我从PHP接收到的响应如下:

$json = array(
    'a' =>  $a,
    'b'     =>  $b,
    'c' =>  $c,
    );
    echo json_encode($json);

我的 JS 代码如下:

var data = ajax.responseText;
data = JSON.parse(data);

我得到了{"a":"苹果","b":"香蕉","c":"胡萝卜"}作为结果,这是由以下操作引起的

json.stringify(data);

1
为什么你想这样做呢?你总是可以使用 obj.a,obj.b,obj.c。 - Sachin Jain
1
请注意,您的问题与JSON 毫无关系。在解析JSON后,您正在使用常规的JS数组和对象。 - Felix Kling
@Felix Kling 谢谢,已经注意到了。 - Wildcard27
3个回答

8

你可以通过以下方式实现此操作:这里有一个例子。

它假设您想将变量放入全局范围。如果是这种情况,这样做就可以:

function extract(variable) {
    for (var key in variable) {
        window[key] = variable[key];
    }
}

var obj = {"a":"apple","b":"banana","c":"carrot"}

extract(obj);

alert(a);
alert(b);
alert(c);

感谢您的迅速回复。您的示例代码有效,但由于某种原因,它遗漏了数组中的最后一个条目,因此我会收到“未捕获的引用错误:c未定义”的错误提示。 - Wildcard27
忽略那个,它只是与同名的其他变量冲突了。新手错误。 - Wildcard27
很棒的答案!但如果你只想在本地函数范围内加载变量,而不是全局窗口范围内怎么办呢?(我知道这是一种边缘情况需求,但会更加优雅。)也许这需要使用eval()吗? - Simon East
1
@SimonEast:我想不到除了使用eval()之外的其他方法,但是在考虑这种方法时一定要非常小心。如果您的值来自用户输入,则恶意用户可能会注入将被执行的代码。 - Travesty3

-1
首先,{"a": "apple," b ":" banana","c": "carrot"} 不是一个数组,而是一个简单的 JSON 字符串。 现在要解析 JSON 字符串,您可以使用
JSON.parse()

它被所有现代浏览器支持,你也可以在这里找到库here

你可以尝试使用你的应用程序来完成这个任务: 假设你的jsonString是一个数组。

 var jsonObj = $.parseJSON("### json string #####");

 for(var index = 0; index < jsonObj.length; index++){
     console.log("a:"+jsonObj[index].a+",b:"+jsonObj[index].b+",c:"+jsonObj[index].c);
 }

你将会得到类似以下的输出:
a: apple, b:banana, c:carrot
. . . 
. . .

希望这能解决你的问题。

在你的例子中,jsonString并不是一个字符串,而是一个数组。另外,###是什么意思? - Felix Kling
你声称 {"a":"apple,"b":"banana","c":"carrot"} 是一个简单的 JSON 字符串,可能是不正确的。如果没有上下文环境,我们无法确定,但如果我的代码是:var obj = {"a":"apple,"b":"banana","c":"carrot"};,那么 obj 是一个 JavaScript 对象,不需要任何 JSON 解析。此外,他的示例没有被方括号包围,因此解析它(假设它是一个字符串)将返回一个单一对象,而不是对象数组。 - Travesty3
抱歉,我只是从参考中保留了jsonString,他可能得到了一个json数组字符串,假设我回答了这个问题。 - NarendraSoni

-1
在Javascript中,数组是对象,而对象也可以是数组。但它们都被初始化为具有特殊行为的对象。
看一下这个答案:

https://dev59.com/l2855IYBdhLWcg3wp2N0#4215753

你会发现你想做的事情非常相似。


并不完全正确。对象不是数组。的确,它们可以被类似地使用,比如如果你有一个对象var obj = {a: 1};,你可以通过做类似于obj['a']的事情来获取值,但这并不意味着它是一个数组。这里有一个例子。无论如何,答案与问题并不相关。他(基本上)询问如何将对象的属性转换为单独的变量,类似于PHP的extract()函数。 - Travesty3
我认为更多的混淆是由于JS允许你做类似var arr = []; arr['key'] = 'value';这样的事情,这会让你认为它是一个带有字符串键的数组,但实际上发生的是你正在设置数组对象上的属性。证明这一点的是,在你这样做之后,你仍然可以使用arr.key访问'value'属性。 - Travesty3
对象不是数组({} instanceof Array 为假)。如果您认为因为可以通过括号表示法obj[foo])访问对象,那么这是因为它是访问对象属性的基本方式之一。括号表示法与数组完全无关。如果允许使用以数字开头的属性名称在点表示法中使用,例如 arr.1,那么您也可以像这样访问数组。但由于不允许这样做,括号表示法是访问数组元素的这两种方式中唯一的一种。 - Felix Kling
@Travesty3:它并没有被静默转换为对象。数组从一开始就是对象(带有额外的方法和行为)。 - Felix Kling
@FelixKling:是的,你说得对。我表述不太好。幸好我还在编辑期内;-) - Travesty3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接