一、问题描述

这周搬砖的时候,前端通过ajax获取后端的数据后,照例用 对象.属性 的方式取值,然而结果总是总是不能如预期般展示在页面上。

先写个 demo 还原下场景:选中一个下拉框列表选项后,会在下拉框下面展示文字。

这是下拉框的html部分:

JSON DEMO

终端设备

PC Web

PHP代码如下:用来返回数据(接收、处理过程略)

$onLines = [

1 => 'PC Web',

2 => 'iPad HD',

5 => 'Touch'

];

echo json_encode(['data' => $onLines]);

JS代码如下:

$("#device").change(function() {

var selectVal = $("#device").val();

if (selectVal == '') {

$("#tip").html('');

return;

}

# code... ajax 部分的代码见下

});

ajax 部分的代码用来接收从后端(PHP)传过来的数据,并处理。

$.ajax({

url: 'device.php',

type: 'post',

dateType: 'json',

data: {

device: selectVal

},

success: function(result) {

var onlineDevices = result.data;

var onlineTip = '允许' + onlineDevices[selectVal] + '类型的2台设备同时在线。';

$("#tip").html('');

$("#tip").append(onlineTip);

}

});

使用 console.log 在控制台输出结果,如下图所示,可以看到后端返回的数据是没有问题的,

再使用 typeof 查看返回的数据类型,前端收到的数据是JSON字符串!而不是JSON对象!

success: function(result) {

console.log(result);

console.log(result.data);

console.log(typeof result);

}

二、解决方法

找到问题就好办了,只需要把 json 字符串转成 json 对象就好了,最简单的办法是 JSON.parse()。

success: function(result) {

var onlineDevices = JSON.parse(result).data;

# code ...

}

三、总结

1、json字符串和json对象的区别

// JSON 字符串

var str1 = '{"data":{"1":"PC Web","2":"iPad HD","5":"Touch"}}';

// JSON 对象

var str2 = {"data":{"1":"PC Web","2":"iPad HD","5":"Touch"}};

console.log(str1);

console.log(typeof str1);

console.log(str2);

console.log(typeof str2);

可以看到json字符串和json对象的形式很像,但前者比后者多了一对引号,其内容包含在引号里了。调试台的结果如下:

2、json字符串转为json对象的方法

后端

设置header头中的内容类型,将 Content-Type 设置为 text/json。

header('Content-Type:text/json;charset=utf-8');

注:前端直接处理即可,不需要 JSON.parse() 处理。

但项目中用的是框架,所有的PHP文件(业务层)均没有显式设置 header,虽然在demo中此方法有效,可依然不明白为什么别的地方返回的是json对象,而这里返回的却是json字符串了。

强制类型转换(object) 此方法无效!

如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,内置标准类 stdClass 的一个实例将被建立。

以上面的数组为例,强制类型转换的结果如下:

var_dump((object)['data' => $onLines]);

// 结果如下:

object(stdClass)#1 (1) {

["data"]=>

array(3) {

[1]=>

string(6) "PC Web"

[2]=>

string(7) "iPad HD"

[5]=>

string(5) "Touch"

}

}

而json_encode((object)['data' => $onLines]);得到的还是json字符串。

前端

var obj = JSON.parse(str);

JSON.parse()方法,必须保证传入的是json字符串,如果是json对象会报错。

var obj = jQuery.parseJSON(str);

parseJSON()方法是jQuery方法,仅支持标准json格式,否则会报错。

下面这些是无效的 JSON 字符串:

"{test: 1}"

//test是属性名称,必须加双引号

"{'test': 1}"

//test是属性名称,必须用双引号(不能用单引号)

"'test'"

//test是属性名称,必须用双引号(不能用单引号)

"undefined"

//undefined 不能表示一个 JSON 字符串; null可以

"NaN"

//NaN 不能表示一个 JSON 字符串; 用Infinity直接表示无限也是不允许的

var obj = eval('(' + str + ')');

eval()方法是js方法,也是必须保证传入的是json字符串,否则会报错。

四、疑惑

查了一下PHP的 json_encode()函数,PHP手册给出的结论是成功时返回字符串。

Return Values

Returns a JSON encoded string on success or FALSE on failure.

既然json_encode()函数返回的是字符串,为什么在项目中其他地方可以直接使用 对象.属性 的方式呢?

后记 更新于2019-02-25

今天不死心,又研究了一下,还问了一个朋友,对方提醒估计大概率是编码和头的设置有问题,然后我逐行查代码,发现 ajax 部分的dataType我写成了dateType,一字之差~

噢,天啊,太丢人了!以后绝对不能再犯这么二的错误了!

eval() 函数 解析json对象

eval在js中用来运行以js源码组成的字符串. 可以用来改变全局或者局部变量,例如: var globalEval = eval; //定义全局eval函数别名 var a ='global', b ...

json对象之间的转化

json字符串转化为 1.使用JSON.parse()函数 使用eval()函数 2.json对象转化为json字符串 使用JSON.stringify()

PHP中json_encode()使用须知,JSON数组和JSON对象

⊰ 偷偷的告诉你,这是一个很不谨慎就会踩得坑 ⊱  如下代码 (看了一下很简单,没毛病啊,老铁) $arr = array( '0'=>'a','1'=>'b','2'=>'c',' ...

php json_encode()函数返回对象和数组问题

php json_encode() 函数格式化数据时会根据不同的数组类型格式化不同类型的json数据 索引数组时 <?php $arr = [1,2,3,4,5]; print_r(json_e ...

js学习-自定义函数、对象的字面量、json对象学习小结

一.自定义对象的构造: var student=new Object(); //object是顶级对象,使用构造函数的方法创建一个对象,此处的意思是创建了一个学生的空对象 student.name=& ...

Js对象转String的函数 和 JSON转String

js对象转string的函数 function obj2str(o){ var r = []; if(typeof o =="string") return "&quot ...

关于JSON对象,以及联合数组,eval函数的使用参考

关于JSON对象,以及联合数组,eval函数的使用参考 var json="{persons:[{name:'Zhangsan',sex:'male'},{name:'Lisi',sex:' ...

关于json&lowbar;encode转数组为json对象时里有数组格式数据的问题

前言:这次是给一款小程序提供接口时发现的 别的不多说,下面直接看出现问题的json数据 可以看到,这是一个大的json对象,是由多维数组组成,一般api接口提供的也是这种格式. 但是仔细看红框中的内容 ...

JSON对象和JSON字符串以及JSON&period;parse 函数的使用

jasonencode php_PHP的json_encode()函数与JSON对象相关推荐

  1. php的json_encode实例,php json_encode()函数返回json数据实例代码

    json_encode()函数用法. echo json_encode(array('a'=>'bbbb','c'=>'ddddd'); 这样就会生成一个标准的json格式的数据 代码如下 ...

  2. json 转对象函数_JSON_QUERY()函数从JSON数据提取对象

    json 转对象函数 In this article, we will explore JSON_QUERY() functions in SQL Server to extract JSON obj ...

  3. jq js json 转字符串_JQuery如何把JSON字符串转为JSON对象

    本文介绍JQuery如何把JSON字符串转为JSON对象. HTML代码 下面的HTML代码实现JQuery把JSON字符串转为JSON对象. Name: Age: City: Country: va ...

  4. Web前台传对象字符串到后台并让后台反序列化对象字符串的方法(ASP.NET) json对象和字符串的转换

    从零开始做了两个月多一点的.NET开发,期间经常遇到需要从Web前台传数据给后台处理的情况.比如下面(用了jQuery的Ajax Post),这里为了演示方便没有对参数进行encodeURICompo ...

  5. jsp 将java对象转json对象 (自定义EL函数)

    功能:在 jsp 页面将 java对象 转换为 json对象 (使用自定义EL函数实现) 步骤: 1. 创建 JSP EL 工具类 2. 创建 tld 文件 3. 配置 web.xml 文件 4. 完 ...

  6. JSON字符串转换为JSON对象 互转函数

    在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键.例如: JSON字符串: var str1 = '{ &q ...

  7. php对象和json对象的互相转换——json_encode、json_decode

    json_encode 用于将php对象转换json对象,成功返回json对象,失败返回false. 例子: json_decode 用于将json对象转换php对象,成功返回php对象,失败返回fa ...

  8. mysql替换json的key_mysql中json_replace函数的使用?通过json_replace对json对象的值进行替换...

    需求描述: 在看mysql中关于json的内容,通过json_replace函数可以实现对json值的替换, 在此记录下. 操作过程: 1.查看带有json数据类型的表 mysql> selec ...

  9. php返回json数组元素,php生成返回json对象数组(json支持中文)

    php生成返回json对象数组 注意两种方法生成的对象数组在结构上的区别 $jarr=array( 'total' => 239, 'list' => array( array( 'cod ...

最新文章

  1. Xamarin环境搭建
  2. Quartz-SchedulerListener解读
  3. springboot约定优于配置的体现
  4. 【php】命名空间 和 自动加载的关系
  5. flink的savepoint实验-scala
  6. 第三次学JAVA再学不好就吃翔(part74)--Calendar类
  7. java的for循环取出数据只是拿到最后一个_一问SQL优化就无从藏身?那只是你对原理的精髓掌握不深
  8. ssis中数据类型_SSIS中的数据挖掘查询
  9. WPF学习笔记5: Xaml之Markup Extensions
  10. 小学三年级计算机基础知识课件,小学三年级信息技术基础知识ppt课件.ppt
  11. 读《scikiit-learn机器学习》黄永昌第二章
  12. OpenJDK 源码阅读之 Java 字节流输入类的实现
  13. kafka安装包下载慢,国内镜像下载地址
  14. BUUCTF_Misc(后续更新....)
  15. java 微信卡券开发 --创建微信卡券
  16. 【免费抢票】6月9日杭州,产品经理会议
  17. 破解三大安防视频痛点,看华为4大硬核视频上云技术
  18. 大家都在问华为手机图片怎么拼图?只需几步就可实现
  19. NXP i.MX 8M Mini处理器
  20. 矩阵快速幂 NOY 301

热门文章

  1. zcat,zgrep用法
  2. i.MX6ULL移植NXP官方uboot2020.04_5.4.47_2.2.0
  3. 笔记本电脑的计算机打不开怎么回事,笔记本电脑excel打不开怎么回事_解决笔记本excel打不开的方法...
  4. 3D学习笔记-牧师与恶魔
  5. Mobox校园云盘一键部署简单高效-完美替换传统FTP
  6. 电子政务私有云盘系统建设必备-Mobox政务盘
  7. 一篇文章带你学会 IDEA 使用中的技巧(珍藏篇)
  8. python实现每天自动签到领积分
  9. 优化求解器SCIP介绍
  10. 厘清Keras中的shape-unit-input-shape-input-dim