为什么JSON没有关联数组?

Com*_*ast -4 arrays json yaml associative-array

为什么JSON没有关联数组?YAML.

你不能在JSON中这样做:

{
    productsBySku: [
        12J432: {
            price: 49.99,
            qty_in_stock: 4
        },
        5X4352: {
            price: 29.99,
            qty_in_stock: 5
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

但是在YAML你可以这样做:

productsBySku:
  - 12J432: 
        price: 49.99,
        qty_in_stock: 4
  - 5X4352:
        price: 29.99,
        qty_in_stock: 5
Run Code Online (Sandbox Code Playgroud)

我在技术层面上想知道为什么这个决定可能是针对JSON做出的.

T.J*_*der 5

为什么JSON没有关联数组?

JSON没有PHP意义上的关联数组(例如,有序映射),但肯定有键/值映射.他们被称为"对象".

我在技术层面上想知道为什么这个决定可能是针对JSON做出的.

Crockford将JSON设计为JavaScript的对象初始化语法的子集.JavaScript没有关联数组(在有序映射意义上),这毕竟是非常不寻常的,因此JSON没有.

YAML

可以?我没有看到他们,而Biffen 似乎暗示不然.

阅读YAML规范,您的YAML与此JSON完全等效(一个对象数组,每个对象都有一个引用从属对象的键):

{
    "productsBySku": [
        {
            "12J432": {
                "price": 49.99,
                "qty_in_stock": 4
            }
        },
        {
            "5X4352": {
                "price": 29.99,
                "qty_in_stock": 5
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

即使YAML确实拥有它们,YAML也不是JSON [1].;-)它们是不同的数据符号,具有不同的设计目标.XML具有名称空间,JSON也没有.YAML支持通过引用重用节点,这允许循环结构,JSON没有.

你不能用JSON做到这一点

这取决于你想要做什么.同样,据我所知,您的YAML与上面的JSON完全相同.

如果您的目标是通过SKU获得该产品列表,您可以:

{
    "productsBySku": {
        "12J432": {
            "price": 49.99,
            "qty_in_stock": 4
        },
        "5X4352": {
            "price": 29.99,
            "qty_in_stock": 5
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

productsBySku属性是一个对象.它的属性没有排序,所以它不是有序的地图,而是一张地图.如果您需要其中的属性才能拥有订单,您必须向它们添加一个属性,指明订单是什么,然后在反序列化后应用该订单.

或者,您可以使用数组,然后在反序列化后构建地图:

{
    "productsBySku": [
        {
            "sku": "12J432",
            "price": 49.99,
            "qty_in_stock": 4
        },
        {
            "sku": "5X4352",
            "price": 29.99,
            "qty_in_stock": 5
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

[1]对于那些不知道的人,YAML代表"YAML不是标记语言".