Json对象和Json字符串的区别

JSON对象

有时候在做项目的时候时常将这两个概念弄混淆,尤其是在使用springmvc的时候,后台@RequestBody接受的是一个json格式的字符串,一定是一个字符串。
先介绍一下json对象,首先说到对象的概念,对象的属性是可以用:对象.属性进行调用的。例如:

 var person={"name":"tom","sex":"男","age":"24"}//json对象console.log(person.name);//在控制台输出tomalert(typeof(person));//object

以上就是json对象。是一个用perosn.name这种方式进行属性的调用。第三行代码就是看person的类型,为object类型。

JSON字符串

字符串,我们常说的javascript中的字符串是单引号或者双引号引起来的。那么json字符串是什么概念呢?

 var b='{"name":"2323","sex":"afasdf","age":"6262"}';//json字符串console.log(b);//{"name":"2323","sex":"afasdf","age":"6262"}alert(typeof(b));//string

以上就是b就是一个字符串,也是一个json字符串,之所以叫json字符串,因为字符串的格式符合json的格式,所以叫做json字符串,第三行代码也匹配其中的类型为string。

json字符串和json对象的转换

json字符串转json对象,调用parse方法:

var b='{"name":"2323","sex":"afasdf","age":"6262"}'//json字符串
var bToObject=JSON.parse(b);
console.log(bToObject.name);//2323

json对象转为json字符串:

var a={"name":"tom","sex":"男","age":"24"}//json对象
var aToString=JSON.stringify(a);
console.log(aToString);//{"name":"tom","sex":"男","age":"24"}

Springmvc接受json字符串类型。

在有一段时间做项目,和朋友交流的时候,基于Rest风格的开发,一直理解为前端ajax提交的一个json对象,后台以@RequestBody接受的json对象,后来我发现自己错了,其实不然,前端传入后台的是一个json格式的字符串,下面有一个例子:

<script type="text/javascript">  $(document).ready(function(){  var saveDataAry=[];  var data1={"userName":"test","address":"gz"};  var data2={"userName":"ququ","address":"gr"};  saveDataAry.push(data1);  saveDataAry.push(data2);         $.ajax({ type:"POST", url:"user/saveUser", dataType:"json",      contentType:"application/json",               data:JSON.stringify(saveData), success:function(data){ } }); });  
</script>

上面代码,首先push方法将其封装到数组中,其表现格式:

[{"userName":"test","address":"gz"},{"userName":"ququ","address":"gr"}
]

JSON.stringify(saveData)将其转换为json字符串:同时ajax请求的时候也要指定dataType: “json”,contentType:”application/json” 这样就可以轻易的将一个对象或者List传到Java端。
后台接受

@Controller
@RequestMapping(value = "saveUser", method=RequestMethod.POST ) 
@ResponseBody  
public void saveUser(@RequestBody List<User> users) { userService.batchSave(users); 
}

后台用@RequestBody将其封装到List中。然后进入Service层。

GET、POST方式提时, 根据request header Content-Type的值来判断:
application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理)。




最近在学习Vue.js,里面有个存储、读取本地缓存的功能,不停地用JSON.parse(),和JSON.stringify()来转换JSON字符串和JSON对象。自己有点晕,不明白两者的区别,看起来感觉是一样的,也不知道为什么一定要转换才能用,后来去网上查了些资料,总结一下。

JSON对象 和 JSON字符串是什么?

JSON对象是直接可以使用jQuery操作的格式。
JSON字符串仅仅只是一个字符串,一个整体,不截取的话没办法读取其中存储的数据,不能直接使用。除非alert()它。
JSON对象:

var str1 = {"name": 'zhangsan',"sex": "man"};

JSON字符串:

var str2 = '{"name": "zhangsan", "sex": "man"}';
// 花括号{}两边有''

将JSON字符串转化成JSON对象的方法

// json字符串
var str = '{ "name": "mady", "age": 24 }';1.JSON.parse(str)
var obj = JSON.parse(str);2.eval();
var obj = eval('(' + str +')');3.parseJSON()
var obj = str.parseJSON();// 可这样读取
alert(obj.name);// 打印出来是这样的Objectname: 'Lisi'__proto__: Object

将JSON对象转换成JSON字符串的方法

// obj
Object123456: Object234567: Object1.JSON.stringify()
var last = JSON.stringify(obj);2.toJSONString()
var last = obj.toJSONString();// 打印出来是这样的
{"123456":{"favorite":false},"234567":{"favorite":true}}

注:上面几个转换方法,除了eval()函数是js自带的之外,其他的几个方法都来自json.js包。现在JSON.stringify()和JSON.parse()两个方法都注入到了JavaScript的内建对象里面,前者变成了Object.toJSONstring(),后者变成了String.parseJSON()。

为什么要转换来转换去?

json字符串指的就是json本身,由于JavaScript是弱类型语言,所以没有办法直接传递对象或是数组,所以提出了json格式的字符串,用于数据传递;
ajax中,我们自己拼接的是一个JSON对象,因为它是无数据类型的,所以JS根据其格式默认其是对象,要是往后台发,要先把它转换成JSON字符
ajax的服务器 发过来的,一定是字符串,你想要把它解析,很简单,把它先变成JSON对象才行。

在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以JSON对象JSON字符串之间的相互转换是关键。

对象是一个类的实例,可以调用类里面封装好的方法,但是字符串所能调用的方法就是字符串本身具备的那些指定的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vuex 状态管理

一、在组件中读取 vuex 中的数据 $store.state.sum;二、组件中修改 vuex 中的数据 $store.dispatch(actions fn name, 数据) $store.commit(mutations fn name, 数据)如果没有网络请求或者其他业务逻辑&#xff0c;组件中也可以越过 actions&#xff08;不写 dispatch 直接写…

flask mysql 1366_2017-11-17 Python Flask Script+mysql环境设置

【1.初级版】flask-scrpit安装。使用flask-scrpit可以创建命令&#xff0c;并在Flask的应用上下文中执行&#xff0c;因为这样才能对Flask对象进行修改。Flask Script自带了一些默认的命令&#xff0c;可以运行服务器或者开启带应用上下文的Python命令行。env) D:\python\flask…

vuex 的模块化+命名空间

一、目的&#xff1a;让代码更好维护&#xff0c;让多种数据分类更加明确 二、修改 store.js const person {namespaced: true; // 开启命名空间state: {},getters: {},actions: {},mutations: {} }const count {namespaced: true; // 开启命名空间state: {},getters: {},ac…

idea中常用的快捷键以及一些奇淫技巧 , 加快我们的开发效率

idea中常用的快捷键以及一些奇淫技巧 &#xff0c; 加快我们的开发效率 &#xff01;&#xff01;&#xff01; 知道类名查找你本地以的类 &#xff08;你pom中依赖的类你自己创建的类&#xff09;------------- ctrlshiftt 修改你创建的变量 以及你后面都引用的变量 &#x…

apache2 php mysql_二、Linux服务器apache2+PHP7+mysql环境配置

关于网站搭建的基础知识&#xff0c;请见我的另一篇文章https://www.jianshu.com/p/9c65fcb14e4f此处不加赘述。本文仅介绍Linux服务器环境的配置。一、安装包下载与安装1.安装apache2sudo apt-get install apache22.安装PHP//-y的意思是全部默认选择yes//8条命令分8次输入//1s…

前端给后端传递数据的时候,有些后端自己可以获取到的值应该由前端传递吗?

前端给后端传递数据的时候,有些后端自己可以获取到的值应该由前端传递吗? 场景: 1.比如我向后端传递一个学生做的试卷. 2.后端需要我把学生的答案和标准答案(在获取试卷的时候给我的,我知道很扯淡)同时传递给他. 我认为标准答案没必要传给他 ,因为他可以根据我传给他的试卷…

mysql备份去掉一个库_MySQL备份与恢复(3)mysqldump备份多个库

一、mysqldump的工作原理、利用mysqldump命令备份数据的过程&#xff0c;实际上就是把数据从mysql库以逻辑的sql语句的形式直接输出或生成备份的文件的过程利用这个备份文件恢复的时候的原理&#xff1f;就是把备份的sql命令再执行一遍。二、备份多个库mysql>show databases…

关于引入 js 文件

一、说说 script 标签的几个常用属性 async 表示立即下载该 js 文件&#xff0c;但不妨碍页面中的其他操作&#xff08;只对外部 js 文件有效&#xff09;defer 表示该 js 文件可以延迟到整个页面被解析并显示之后再执行&#xff08;只对外部 js 文件有效&#xff09;src 指定…

mysql where条件使用了or会不会扫全表

mysql where条件使用了or会不会扫全表 是的 但是使用索引在某些情况下可以避免的&#xff1a; 1、where 语句里面如果带有or条件, myisam表能用到索引&#xff0c; innodb不行。 2、必须所有的or条件都必须是独立索引 3、用UNION替换OR (适用于索引列) 4、用in来替换or 不管用不…

mysql 数据库 文件夹_mysql 数据库 文件夹

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

JS 深浅拷贝

在日常开发当中那面会遇到对象拷贝问题 一、对象浅拷贝&#xff08;shallowClone&#xff09; 使用 Object.assign 把源对象自身的、可枚举的属性拷贝到目标对象上 var person {name: 张三,age: 18,sex: 男,hobbies: [篮球, 足球, 排球],sayName: function () {console.log(t…

mysql事务回滚后,自增ID仍然增加

事务回滚后&#xff0c;自增ID仍然增加 回滚后&#xff0c;自增ID仍然增加。 比如当前ID是7&#xff0c;插入一条数据后&#xff0c;又回滚了。 然后你再插入一条数据&#xff0c;此时插入成功&#xff0c;这时候你的ID不是8&#xff0c;而是9. 因为虽然你之前插入回滚&#…

mysql is needed by_libnuma.so.1()(64bit) is needed by mysql-community-server-5.7.9-1.el6.x86_64

今天在安装 MYSQL -5.7.9的时候&#xff0c;rpm -Uvh mysql-community-server-5.7.9-1.el6.x86_64.rpm提示&#xff1a;warning: mysql-community-server-5.7.9-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEYerror: Failed dependencies:libnuma.so…

MySQL 查询速度慢与性能差的原因与解决方法

MySQL 查询速度慢与性能差的原因与解决方法 更新时间&#xff1a;2019年09月26日 18:05:47 作者&#xff1a;Microtiger 随着网站数据量与访问量的增加&#xff0c;MySQL 查询速度慢与性能差的问题就日渐明显&#xff0c;这里为大家分享一下解决方法,需要的朋友可以参考下 一…

重写JS数组常用方法

Array.prototype.forEach 没有返回值 参数1&#xff1a;遍历数组时需要执行的回调函数 回调函数参数1&#xff1a;数组的每一项 item回调函数参数2&#xff1a;每一项的下标 index回调函数参数3&#xff1a;整个数组 array 参数2&#xff1a;这个回调函数的 this 指向 Array.pr…

mysql 时间戳 2038_mysql数据库的timestamp为什么从1970到2038的某一时间?某一时间是指什么时间?过了这个时间之后怎么办?-问答-阿里云开发者社区-阿里云...

首先你要理解什么是时间戳。时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至某一时间点的总秒数。例如北京时间2015-12-31 17:00:00的时间戳是1451552400&#xff0c;就是指从北京时间1970-01-01 08:00:00到2015-12-31 17:00:00已经…

MySQL 批量插入数据,单次插入多少条数据效率最高

文章目录一、前言二、批量插入前准备1、插入到数据表的字段2、计算一行字段占用的空间3、在数据里做插入操作的时候&#xff0c;整体时间的分配三、批量插入数据测试1、SQL语句的大小限制2、查看服务器上的参数&#xff1a;3、计算一次能插入的最大行记录4、测试插入数据比对&a…

重写 typeof 方法

重写 typeof 方法 function myTypeof(str) {var toStr Object.prototype.toString,typeofStr typeof(str),typeTemp {[object Object]: object, // 检测对象[object String]: object-string, // 检测包装类 String[object Number]: object-number, // 检测包装类 Number[ob…

mysql+跨服务器+写入_MySQL中使用FREDATED引擎实现跨数据库服务器、跨实例访问

跨数据库服务器&#xff0c;跨实例访问是比较常见的一种访问方式&#xff0c;在Oracle中可以通过DB LINK的方式来实现。对于MySQL而言&#xff0c;有一个FEDERATED存储引擎与之相对应。同样也是通过创建一个链接方式的形式来访问远程服务器上的数据。本文简要描述了FEDERATED存…

MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)

MYSQL避免全表扫描 1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引 2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描 如&#xff1a;select id f…