json_decode转换json数据为数组出现的问题!

  json_decode这个函数是json_encode的反函数,一般传递数据的时候为了压缩数据,会将数组格式的数据转换成json格式,用到的函数就是json_encode,然后接收到数据之后再用json_decode转换回数组,这里本来应该不会出现什么问题, 但也有意外,这个意外应该可以说也是自己造成,bom头导致的bug,其实准确来说也不算bug,但就是让你的数据无法正确转换回来;

  bom头的产生应该是你的文件在windows下用记事本这些东西编辑过之后的后果,可能无意之间就给这个bug的产生带来了隐患;但是就算出现这个问题也不用慌张, 凡是都有解决的办法;

  json_decode($json)之后可能出现返回空,null等结果,这个时候一般都是json格式出问题, 可以用json_last_error()来检查,json_last_error()函数的使用方式就是在json_decode之后添加这个函数, 函数会返回值,返回0说明格式没错, 我遇到的事返回4,说明格式错误,之前用json在线检测工具检测数据,显示是正确的,这两个居然矛盾,让我大惑不解,不过如果知道bom头这个概念立马就应该反应过来, bom头是看不见的, 所以转换的时候前面多了三个字节,当然看不见, 在线检测的时候复制这个数据没有bom头的三个字节,当然也就正确了, 所以立马用$json=substr($json,3);这个函数,去掉头部的三个字节, 转换之后ok了;

  问题解决之后感概万千, 因为这个问题我找了两天,本来问题影藏的不深,只是代码不是自己写的, 其次本地环境与服务器环境不一致, 反正诸多原因,一直没想到会是这个问题;最后一步一步排查,锁定这个函数;感觉以后编辑文件一定不能图方便, 一个小错误就直接用记事本大概编辑一下就行了, 很容易出现这个bom头问题;而且自己还不知道;

这里贴出一段代码, 可以去除网站所有文件的bom头信息;

 1 <?php
 2 if (isset($_GET[‘dir‘])){ //设置文件目录
 3 $basedir=$_GET[‘dir‘];
 4 }else{
 5 $basedir = ‘.‘;
 6 }
 7 $auto = 1;
 8 checkdir($basedir);
 9 function checkdir($basedir){
10 if ($dh = opendir($basedir)) {
11 while (($file = readdir($dh)) !== false) {
12 if ($file != ‘.‘ && $file != ‘..‘){
13 if (!is_dir($basedir."/".$file)) {
14 echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." <br>";
15 }else{
16 $dirname = $basedir."/".$file;
17 checkdir($dirname);
18 }
19 }
20 }
21 closedir($dh);
22 }
23 }
24 function checkBOM ($filename) {
25 global $auto;
26 $contents = file_get_contents($filename);
27 $charset[1] = substr($contents, 0, 1);
28 $charset[2] = substr($contents, 1, 1);
29 $charset[3] = substr($contents, 2, 1);
30 if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
31 if ($auto == 1) {
32 $rest = substr($contents, 3);
33 rewrite ($filename, $rest);
34 return ("<font color=red>BOM found, automatically removed._<a href=http://www.k686.com>http://www.k686.com</a></font>");
35 } else {
36 return ("<font color=red>BOM found.</font>");
37 }
38 }
39 else return ("BOM Not Found.");
40 }
41 function rewrite ($filename, $data) {
42 $filenum = fopen($filename, "w");
43 flock($filenum, LOCK_EX);
44 fwrite($filenum, $data);
45 fclose($filenum);
46 }

这段代码也是网上找来的, 用了觉得还是蛮方便,不过不敢在服务器上用,以免造成位置的别的什么错误;

所以想到一个折中的办法, 现在本地跑了一下,把出现bom的文件全都替换,然后服务器上的问题并没有解决,然后又在转换json的时候添加了一个判断

if(preg_match(‘/^\xEF\xBB\xBF/‘,$json))
{
$json=substr($json,3);
}

这样如果检测得到bom头信息去掉就好了;

时间: 2024-11-07 00:28:53

json_decode转换json数据为数组出现的问题!的相关文章

NSJSONSerialization 转换JSON数据的 NSJSONReadingOptions的意思

[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingOptions error:&error]; NSJSONReadingOptions有三个枚举值,具体含义如下: 1.NSJSONReadingMutableContainers :Specifies that arrays and dictionaries are created as mutable objects. 指定方法创建的数组和字典是可变的对象.(意

在线转换JSON与PHP数组(json php array)

在线转换json与php数组 www.jsonaz.com 例如json数据 { "number" : 1, "tuple" : [1,2,3], "dict" : { "a": "apple", "b": "banana" }, "complex": { "person": { "name" : "

C#的百度地图开发(二)转换JSON数据为相应的类

原文:C#的百度地图开发(二)转换JSON数据为相应的类 在<C#的百度地图开发(一)发起HTTP请求>一文中我们向百度提供的API的URL发起请求,并得到了返回的结果,结果是一串JSON数据,我们先将这个JSON数据,使用在线工盯进行格式化. [html] view plaincopy { "status": 0, "result": [ { "x": 39.926674689976, "y": 116.4659

mustache 获取json数据内数组对象指定元素的方法

由于最近项目再用mustache,因此发现了这个问题,mustache无法获取json数据内数组键值的指定索引的元素 遂上网查资料总结一下两种方法 1,数据为数组对像 var obj = [{name: 'foo'}, {name: 'bar'}]; var tmp = '{{#1}}{{name}}{{/1}}'; console.log(Mustache.render(tmp, obj)); //bar 这种方法个人觉得有一定局限性 -----参照:http://stackoverflow.

Spring MVC登录注册以及转换json数据

项目结构; 代码如下: BookController package com.mstf.controller; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.map.ObjectMapper; import com.mstf.

3中转换JSON数据的方式

一:前言 来公司一个星期,把最近做的东西梳理下,并把觉得有必要的知识点记载下,现在传数据很多都是用JSON来传数据,所以我就找了集中传json的方式,其实是有五种的,但是有一个我没有用过,太陌生了,上次也在网上看了看,估计可以照着用,但是要我讲的话我还是觉得挺有难度的.还有个也没有用过.我都会在下面提一下 二:内容 我现在可以用的JSON有三种: (一):Google的JSON的jar包处理 (二):阿里巴巴解析JSON的jar包 (三):Struts2解析的jar包 (四):jsonrpc,这

SpringMVC转换JSON数据(1)

SpringMVC提供了处理JSON格式请求/响应的        HttpMessageConverter:MappingJackson2HttpMessageConverter.利用Jackson开源类包处理JSON格式的请求或响应消息. 我们需要做的: 在Spring容器中为RequestmappingHandlerAdapter装配处理JSON的HttpMessageConverter 在交互过程中请求Accept指定的MIME类型 org.springframework.web.bin

Gson转换json数据为对象

可以通过Gson使用两种方法,将json字符串转换为对象,以下面该段报文做测试 { "id": 84041462, "lastName": "小华", "age":32, "balance":666255.32, "hobbyDesc": { "subject": "数学", "score":25, "sport_de

把json数据 [ { } ] 转为数组

$str = '[{"rwx_price":388.5,"end_station_name":"长沙","swz_price":0,"swz_num":"--","to_station_name":"长沙","ydz_num":"--","yz_num":"*",&qu