将PHP关联数组转换为JSON关联数组

3

我正在将一个 PHP 中的查找表通过 json_encode 转换为 JavaScript,这个表格看起来像这样:

 AbilitiesLookup Object
(
[abilities:private] => Array
    (
        [1] => Ability_MeleeAttack Object
            (
                [abilityid:protected] => 
                [range:protected] => 1
                [name:protected] => MeleeAttack
                [ability_identifier:protected] => MeleeAttack
                [aoe_row:protected] => 1
                [aoe_col:protected] => 1
                [aoe_shape:protected] => 
                [cooldown:protected] => 0
                [focusCost:protected] => 0
                [possibleFactions:protected] => 2
                [abilityDesc:protected] => Basic Attack
            )
            .....snipped...

在JSON中,它是这样的:

{"1":{"name":"MeleeAttack","fof":"2","range":"1","aoe":[null,"1","1"],"fp":"0","image":"dummy.jpg"},....

问题是我得到了一个 JS 对象,而不是数组,并且标识符是一个数字。我看到解决此问题的两种方法——一是找到一种使用数字访问 JSON 的方法(我不知道如何做),二是使 json_encode(或其他自定义编码函数)可以生成 JavaScript 关联数组。
(是的,我的 JavaScript 知识有些欠缺)。
注意:JSON 输出与数组不匹配——这是因为我对每个下标中的元素进行手动 JSON 编码,然后将其推送到一个数组中(以索引作为键),然后对其使用 json_encode。需要明确的是,数字不是连续的,因为它是关联数组(这就是为什么 JSON 输出不是一个数组)。

1
JavaScript中的数组始终具有从零开始的顺序索引。JavaScript对象是一个关联数组。除了对象之外,JavaScript中没有其他行为类似于关联数组的类型。 - Kamil Szot
2个回答

12

array('a', 'b', 'c') 的编码为 ['a', 'b', 'c']。

也许将 PHP 数组转换为对象的原因是您从 1 开始索引数组而不是从 0 开始。

我已经检查过了。

<?php
echo json_encode(array('a', 'b', 'c'))."\n";
echo json_encode(array(0 => 'a', 'b', 'c'))."\n"; // same as above but explicit
echo json_encode(array(1 => 'a', 'b', 'c'))."\n";

提供

["a","b","c"]
["a","b","c"]
{"1":"a","2":"b","3":"c"}

1
是的,json_encode(array(0 => 'a', 'b', 'c')) 会得到 ["a","b","c"]。也许你应该在你的回答中明确提到这一点。 - Ates Goral

9

JavaScript对象属性名可以是任何格式的字符串。甚至可以只是数字(就像在您的情况下一样),使用数字索引/键访问它们也没有问题:

var obj = {
    "1": "foo",
    "2": "bar"
};

obj["1"]; // returns "foo"
obj[1]; // returns "foo" (1 will implicitly get cast to the string "1")

1
我认为这个应该得到点赞并被接受,因为它直接解决了Extrakun的问题:“找到一种使用数字访问JSON的方法(我不知道怎么做)”。 - Kamil Szot
@Extrakun:我认为一个过于着急的用户可能会对"1": "foo"语法感到恼火... - Ates Goral

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