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做出的.
为什么JSON没有关联数组?
JSON没有PHP意义上的关联数组(例如,有序映射),但肯定有键/值映射.他们被称为"对象".
我在技术层面上想知道为什么这个决定可能是针对JSON做出的.
Crockford将JSON设计为JavaScript的对象初始化语法的子集.JavaScript没有关联数组(在有序映射意义上),这毕竟是非常不寻常的,因此JSON没有.
YAML
阅读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不是标记语言".