:项目客户反馈,输出的json中有一个数据字段需要对象,在某些情况下返回[]而不是{};数据由公司其他部门提供,查看原始数据时未发现问题;后来因为加了一些预处理,得到其他部门的json数据后,进行解码,对某个字段进行处理;然而,处理完Output后再次使用JSON,发现结果并不是我们想要的。Rawdata{...,"foo":"","bar":{},...}其中foo是我要处理的字段,处理完再用json_encode($data)对JSON进行编码。编码完成后,结果是这样的{...,"foo":"","bar":[],...}空对象用空数组编程,我没有处理字段栏通过模拟数据实测发现是因为在解码JSON的时候,是这样解决的。$data=json_decode($jsonString,true)问题就出在这里。由于PHP本身的特性,数组在PHP语言中可以表示强类型,如Java中的List、Map。看看PHP中的json_decode()方法是如何定义的mixedjson_decode(string$json[,bool$assoc=false[,int$depth=512[,int$options=0]]])sourcehttp://php.net/manual/zh/function.json-decode.php当第二个参数$assoc为true时,返回的类型是数组,那么问题来了,JSON中空对象{}和[]空数组时,用这个两种方法解码的结果是一致的;即,array();当json_encode()再次编码时,{}变为[]。所以正确的做法是在解码JSON的时候不要把第二个参数传给json_decode;让解码结果成为一个对象,然后操作对象的属性。操作完成后,再次编码不会出现偏差。这类问题最突出的问题在于强类型语言和弱类型语言的API对接。由于项目的下家是使用Java语言,所以导致BUG文章。也可以看我的博客http://www.hfxblog.com/2017/08/03/2017-08-02-Php-json-decode/
