首先,json是一种数据格式,而不能说是一种对象(object)。这一点是非常重要的。

起源是不同的语言中数据对象的形式是不一样的,我们为了在不同的语言中传递数据,发明了一种json格式用于消除这种差异。比如,在js中,我们把js对象以json的格式来包装,然后把它字符串传递到其他的地方,比如java后台,这样后台取到这个字符串以后,就可以将其转化成一个json格式的java对象,否则java后台是无法识别一个js的对象的。可以说,json是不同的语言之间数据交换的一种桥梁,类似于之前的xml,只不过它比xml要来的更加简洁,方便,好用。

1.js对象

以下是一个js的对象。我们可以看到它是一个键值对

  1. var xiaoming = {
  2. name: '小明',
  3. age: 14,
  4. gender: true,
  5. height: 1.65,
  6. grade: null,
  7. 'middle-school': '\"W3C\" Middle School',
  8. skills: ['JavaScript', 'Java', 'Python', 'Lisp']
  9. };

接下来我们使用var s = JSON.stringify(xiaoming);语句把上述的js对象包装成一个具有json格式的字符串。如下所示,然后我们就可以将这个字符串传递到其他地方区使用了。

  1. {
  2. "name": "小明",
  3. "age": 14,
  4. "gender": true,
  5. "height": 1.65,
  6. "grade": null,
  7. "middle-school": "\"W3C\" Middle School",
  8. "skills": [
  9. "JavaScript",
  10. "Java",
  11. "Python",
  12. "Lisp"
  13. ]
  14. }

2.json的格式

观察上述的json格式的字符串,我们不难发现,他和js的对象十分接近,除了json格式的字符串需要用双引号包围住键。事实上,上述的json格式的字符串完全也可以的当成一个js对象,因为js并不排斥在键上面包围双引号。只不过这个js对象是json格式的js对象。也就是说,假如我们定义如下代码,是完全可以的。

  1. var a={
  2. "name": "小明",
  3. "age": 14,
  4. "gender": true,
  5. "height": 1.65,
  6. "grade": null,
  7. "middle-school": "\"W3C\" Middle School",
  8. "skills": [
  9. "JavaScript",
  10. "Java",
  11. "Python",
  12. "Lisp"
  13. ]
  14. }
  15. console.log(a.name);

注意我的措辞,我始终没有说json对象,而是js对象,这是因为在js中只有js对象,而没有所谓的json对象。广义的js对象包含所有对象,如字符串,数字,object,而狭义的就只有object。也就是上面我们举例的xiaoming或者a这个对象。

3.格式错误

经常我们再js代码中需要接受一个其他地方传过来的json格式的字符串,然后通过JSON.parse()方法来把它变成json格式的js对象,这时候如果这个字符串不是json格式,就会报错。

常见的错误有以下几种。

a.键没有用双引号包围,这是最常见的错误。

b.最后一个键值对后面多了一个逗号,这是不允许的。如下面例子所示。

  1. JSON.parse('[1, 2, 3, 4, ]');
  2. JSON.parse('{"foo" : 1, }');
  3. // SyntaxError JSON.parse: unexpected character
  4. // at line 1 column 14 of the JSON data

换成这样就不会报错了。

  1. JSON.parse('[1, 2, 3, 4 ]');
  2. JSON.parse('{"foo" : 1 }');

具体错误分析可以看这里:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Errors/JSON_bad_parse

4.几个常用的方法

在js中,主要需要处理的是json格式的对象和json格式的字符串的转换问题。有以下几个常用的方法可以帮助我们做这些事情。

首先要确定的是,这些方法不仅适用于js对象,也试用于js数组。我们以例子来介绍。

--JSON.stringify:这个方法是将js对象转换成json格式的字符串。

  1. //js对象
  2. var xiaoming={
  3. name: '小明',
  4. age: 14,
  5. gender: true,
  6. height: 1.65,
  7. grade: null,
  8. 'middle-school': '\"W3C\" Middle School',
  9. skills: ['JavaScript', 'Java', 'Python', 'Lisp']
  10. }
  11. //数组对象
  12. var student = [{
  13. name: '小明',
  14. age: 14,
  15. gender: true,
  16. height: 1.65,
  17. grade: null,
  18. 'middle-school': '\"W3C\" Middle School',
  19. skills: ['JavaScript', 'Java', 'Python', 'Lisp']
  20. },{
  21. name: '小红',
  22. age: 13,
  23. gender: true,
  24. height: 1.65,
  25. grade: null,
  26. 'middle-school': '\"W3C\" Middle School',
  27. skills: ['JavaScript', 'Java', 'Python', 'Lisp']
  28. }];
  29. var s1=JSON.stringify(xiaoming);
  30. var s2=JSON.stringify(student);
  31. console.log(s1);
  32. console.log(s2);
  1. console.log(s1.name);

上述代码的运行结果是

  1. {"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}
  2. Box.html:66:1
  3. [{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]},{"name":"小红","age":13,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}]
  4. Box.html:67:1
  5. undefined

可以看到不管是js对象还是js数组对象,都转换成了标准的json格式的字符串,由于s1和s2都是字符串,自然无法使用s1.name这样的只要js对象才有的取值方式了。

--JSON.parse:该方法用于将json格式的字符串转换成js对象。首先要保证这个字符串是json格式的,否则该方法会报错,参照第3条。

  1. //js对象
  2. var xiaoming={
  3. name: '小明',
  4. age: 14,
  5. gender: true,
  6. height: 1.65,
  7. grade: null,
  8. 'middle-school': '\"W3C\" Middle School',
  9. skills: ['JavaScript', 'Java', 'Python', 'Lisp']
  10. }
  11. //数组对象
  12. var student = [{
  13. name: '小明',
  14. age: 14,
  15. gender: true,
  16. height: 1.65,
  17. grade: null,
  18. 'middle-school': '\"W3C\" Middle School',
  19. skills: ['JavaScript', 'Java', 'Python', 'Lisp']
  20. },{
  21. name: '小红',
  22. age: 13,
  23. gender: true,
  24. height: 1.65,
  25. grade: null,
  26. 'middle-school': '\"W3C\" Middle School',
  27. skills: ['JavaScript', 'Java', 'Python', 'Lisp']
  28. }];
  29. var s1=JSON.stringify(xiaoming);
  30. var s2=JSON.stringify(student);
  31. var o1=JSON.parse(s1);
  32. var o2=JSON.parse(s2);
  33. console.log(o1);
  34. console.log(o2);
  35. console.log(o1.name);

上述代码的执行结果为:

可以看到,转换成了js的标准的对象,键值是没有双引号的。这时候我们使用o1.name 就可以获取到name的值了。

与JSON.parse()相同效果的方法还有jQuery.parseJSON(data),eval("("+data+")"),其中data是json格式的字符串,不推荐使用最后一种方法。

js中json知识点的更多相关文章

  1. js中Json字符串如何转成Json对象(4种转换方式)

    js中Json字符串如何转成Json对象(4种转换方式) 一.总结 一句话总结:原生方法(就是浏览器默认支持的方法) 浏览器支持的转换方式(Firefox,chrome,opera,safari,ie ...

  2. js中JSON的解析(将json字符串转化为对象)和序列化(将对象转化为json字符串)(函数的功能一般都挺全的,需要的时候去查看完整函数)

    js中JSON的解析(将json字符串转化为对象)和序列化(将对象转化为json字符串)(函数的功能一般都挺全的,需要的时候去查看完整函数) 一.总结 1.JSON解析:JSON.parse(myJS ...

  3. js中json数据简单处理(JSON.parse()和js中嵌套html)

    js中json数据简单处理(JSON.parse()和js中嵌套html) 一.总结 1.html中嵌套js:<script>js代码</script> 2.js中嵌套html ...

  4. js中json法创建对象(json里面的:相当于js里面的=)

    js中json法创建对象(json里面的:相当于js里面的=) 一.总结 json里面的:相当于js里面的= 4.json创建js对象解决命名冲突:多个人为同一个页面写js的话,命名冲突就有可能发生, ...

  5. js中 json对象与json字符串相互转换的几种方式

    以下总结js中 json对象与json字符串相互转换的几种方式: 一.JSON对象转化为JSON字符串 1.使用JSON.stringify()方法进行转换 该方法不支持较老版本的IE浏览器,比如:i ...

  6. php和js中json的编码和解码

    php中 1)编码 $jsonStr = json_encode($array) 2)解码 $arr = json_decode($jsonStr) <?php echo json_encode ...

  7. Js中JSON数据交换使用总结

    Json格式简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是JavaScript原 ...

  8. JS中json数据的处理

    1.  json数据结构(对象和数组) json对象:var obj = {"name":"xiao","age":12}; json数组: ...

  9. js中json的转换

    //aa='{"id":0,"appId":"app***********Id","appSecret":"a ...

随机推荐

  1. iOS开发 2x 3x图

    众所周知,iOS开发中的图片资源一般需要2倍图和3倍图,也就是2x,3x,但是最近思考了一个问题,为什么不能只提供3x的图片,2x的图片让系统从3x压缩就好了,于是上网搜索了下,得到了答案. 当我们在 ...

  2. java序列化问题

    今天无意中看到了     redistemplet封装的类中,出现了序列化的字眼 ,了解下序列化的知识 1.什么是序列化 我们把变量从内存中变成可存储或传输的过程称之为序列化,(java中一般是用来保 ...

  3. Python下HttpHTTPClient和AsyncHTTPClient

    HTTPClient 使用例子: from tornado.httpclient import HTTPClient def synchronous_fetch(url): http_client = ...

  4. 解决error: only position independent executables (PIE) are supported

    在Android.mk文件中添加以下内容 LOCAL_CFLAGS += -pie -fPIE LOCAL_LDFLAGS += -pie -fPIE 原帖地址:http://blog.csdn.ne ...

  5. c 时间 学习

    linux #include <stdio.h> #include <time.h> int main(int argc,char **argv) { //两种时间的获取方法 ...

  6. PL/SQL编码规范的一些建议

    由于业务的复杂多变,我们编写完的程序,在后期肯定要被修改,而且修改的人很可能不是自己.这种情况我们都遇到过. 而且,看别人的代码可能会觉得很痛苦:为什么他要这样写相关逻辑?为什么变量名称要这样定义?换 ...

  7. Android Uri获取真实路径以及文件名的方法【转】

    原文地址:https://blog.csdn.net/MikoGodZd/article/details/50979653 在Android 编程中经常会用到uri转化为文件路径 下面是4.4后通过U ...

  8. python java scala 单例模式

    Python class Single2(object): """ 同一个对象 """ __instance = None def __ne ...

  9. easyUi onLoadSuccess:、onChange这些事件不能嵌套使用!!!!

    easyUi  onLoadSuccess:.onChange这些事件不能嵌套使用!!!!

  10. C++ Custom Control控件 向父窗体发送对应的消息

    向父窗体发送消息 ,这里只讲发送 WM_NOTIFY  消息, 其它消息是相同的 在 控件中的某个函数中 设置发送消息的程序 首先定义一个WM_NOTIFY消息的专用结构. NMHDR nm; nm. ...