在PHP中将JSON[]和{}表示为不同的值可以吗?

在PHP中将JSON[]和{}表示为不同的值可以吗?,php,json,data-representation,Php,Json,Data Representation,我正在为JSON变体编写数据和字符串解析器。我的理解是,标准JSON与PHP不兼容,因为PHP对JSON数组和JSON对象使用相同的数据类型(数组)。空JSON数组和对象的问题很严重,因为一旦转换为PHP值,它们就无法区分。因此,如果从JSON字符串“[]”和“{}”开始,将它们转换为值,然后再转换回JSON,则它们看起来是一样的 我的基本想法是要求打算表示为JSON对象的PHP数组,特别是应该编码或字符串化为“{}”的空数组,在PHP程序中以不同的方式表示,这样就可以进行正确的错误检查和JSO

我正在为JSON变体编写数据和字符串解析器。我的理解是,标准JSON与PHP不兼容,因为PHP对JSON数组和JSON对象使用相同的数据类型(数组)。空JSON数组和对象的问题很严重,因为一旦转换为PHP值,它们就无法区分。因此,如果从JSON字符串“[]”和“{}”开始,将它们转换为值,然后再转换回JSON,则它们看起来是一样的


我的基本想法是要求打算表示为JSON对象的PHP数组,特别是应该编码或字符串化为“{}”的空数组,在PHP程序中以不同的方式表示,这样就可以进行正确的错误检查和JSON转换。当然,对于非空PHP数组,可以通过编程确定它们是否具有从0开始的连续整数索引。但如果要正确区分空JSON数组和对象,这样的检查就没有用处

这里讨论的实际区别对于正确选择很重要,因为程序员将被要求以不同的方式生成和类型检查PHP数组,这取决于它们是对应于JSON中的“[]”还是“{}”语法

所以,我的问题是:什么样的独特表现是最好的?主要候选人包括:

对于表示JSON对象的PHP关联数组:

  • $JSONobject=(object){}
  • $JSONobject=newstdclass()
  • $JSONobject=json_decode(“{}”)
我将这些单独列出,因为我不确定它们是否都具有相同的内部表示


对于表示JSON数组的PHP顺序列表数组,数组数据类型将不变地使用,因此将由
$JSONarray=[]生成一个空JSON数组
$JSONarray=new Array()

作为实验的结果,我对自己的问题有了一个答案:我发现
json_decode([])
产生一个零长度数组,
json_decode({}”)
产生一个没有属性、没有继承和没有方法的标准类对象。此外,
json\u encode(json\u decode(“[])
结果是
“[]”
,这是正确的,
json\u encode(json\u decode(“{}”)
结果是
“{}”
,这也是正确的

因此,PHP本身选择了我建议的答案,将PHP数组类型分为两个不同的子类型(数组和类对象)

我认为这回答了我的问题,而且,正如我所猜测的,我上面列出的表示JSON“{}”的三种方法确实是等价的


我希望这个问题和答案能够帮助那些将来可能会对这个问题感到困惑的人。使用数组来表示列表和关联映射的模糊性是允许的(可能是建议的),可以用我描述的方式来解决。

如果不实现
json\u decode()的第二个参数
,JSON对象总是变成PHP对象,JSON数组变成PHP数组。您可以通过另一种方式实现相同的映射:PHP数组变成JSON数组,PHP对象变成JSON对象。仅供参考,
JSON\u encode()
有一个
JSON\u FORCE\u OBJECT
标志,这将导致空数组被编码为
{}
而不是
[]
“我的理解是标准JSON与PHP不兼容”…不,PHP对JSON有很好的支持。“我的基本想法是要求打算表示为JSON对象的PHP数组,特别是应该编码或字符串化为“{}”的空数组在PHP程序中以不同的方式表示。”…您可以使用对象/类来代替。Barmar 1:不。第二个参数仅确定解决歧义的方式。Barmar 2:完全正确。这就是问题所在!Adyson 1:我在PHP中清楚地解释了歧义。Adyson 2:这正是我在问题结束时解释的建议。