JSON知识总结入门篇

1.     何谓JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON具有如下具体形式:

1)JSON是一个无序的“名称/值”对的集合。一个对象以“{”开始,“}”结束,每个名称后跟一个“:”号,“名称/值”对之间使用“,”分隔;

2)数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔;

3)值(value)可以是双引号括起来的字符串(string)、数值(number)truefalse null、对象(object)或者数组(array)。这些结构可以嵌套;

4)字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似;

5)数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

2.     JSONXML的比较

从如下部分进行比较:

1)可读性JSONXML的可读性稍微差点,相比来说XML更结构化。一边是简易的语法,一边是规范的标签形式;

2) 可扩展性XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。不过JSONJavascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势;

3) 编码难度XML有丰富的编码工具,比如Dom4jJDom等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON字符串,不过,xml文档要多很多结构上的字符;

4)解码难度

XML的解析方式有两种:一是通过文档模型解析,也就是通过父标签索引出一组标记。例如:xmlData.getElementsByTagName("tagName"),但是这样是要在预先知道文档结构的情况下使用,无法进行通用的封装。

另外一种方法是遍历节点(document 以及 childNodes)。这个可以通过递归来实现,不过解析出来的数据仍旧是形式各异,往往也不能满足预先的要求。

凡是这样可扩展的结构数据解析起来一定都很困难。

如果预先知道JSON结构的情况下,使用JSON非常简单。纯粹的前台开发人员,一定会非常喜欢JSON。但是如果你是一个应用开发人员,就不是那么喜欢了,毕竟xml才是真正的结构化标记语言,用于进行数据传递。而如果不知道JSON的结构而去解析JSON的话,那就非常费劲。

Javascript地盘内,JSON毕竟是主场作战,其优势当然要远远优越于xml。如果JSON中存储Javascript复合对象,而且不知道其结构的话,我相信很多程序员也一样是哭着解析JSON的。

3.     简单实例

3.1从文本中取得JSON字符串

3.1.1 功能描述

在下面的实例中json.html通过ajax获得json.txt中的JSON字符串的内容,并在json.html对结果进行解析后进行展示。

3.1.2 JSON字符串文件:json.txt

如果json.txt文件中的json字符串为:


 
  1. {  
  2. "programmers": [  
  3.     { "firstName""阿蜜果""lastName":"McLaughlin""email""brett@newInstance.com" },  
  4.     { "firstName""范范""lastName":"Hunter""email""jason@servlets.com" },  
  5.     { "firstName""高子""lastName":"Harold""email""elharo@macfaq.com" }  
  6.    ],  
  7. "authors": [  
  8.     { "firstName""安安""lastName""Asimov""genre""science fiction" },  
  9. "firstName""Tad""lastName""Williams""genre""fantasy" },  
  10. "firstName""Frank""lastName""Peretti""genre""christian fiction" }  
  11.    ],  
  12. "musicians": [  
  13.     { "firstName""茂茂""lastName""Clapton""instrument""guitar" },  
  14. "firstName""Sergei""lastName""Rachmaninoff""instrument""piano" }  
  15.    ]  



 


 

例如如果想获得第一个程序员的firstName,可通过如下语句:

第二个authorsgenre可通过如下语句获得:3.1.2 JSON字符串读取和解析文件:json.html

var result  =  xmlHttp.responseText;
var json 
=  eval( " ( "   +  result  +   " ) " );
alert(json.programmers[
0 ].firstName);

 

json.authors[ 0 ].genre

 

将如上的json.txt保存为UTF-8的文件,编辑json.html文件,内容参考如下:

ajax的回调函数handleStateChange中,读者可对照json.txt文件重点关注下json字符串的取值方法。

 
  1. <html> 
  2.     <head> 
  3.         <title>JsonTest</title> 
  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  5.         <script type="text/javascript"> 
  6.         var xmlHttp;  
  7.         function createXMLHttpRequest()  
  8.         {  
  9.             if(window.ActiveXObject)  
  10.             {  
  11.                 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");  
  12.             }  
  13.             else if(window.XMLHttpRequest)  
  14.             {  
  15.                 xmlHttp = new XMLHttpRequest();  
  16.             }  
  17.         }  
  18.  
  19.         function startRequest()  
  20.         {  
  21.             createXMLHttpRequest();  
  22.             try  
  23.             {  
  24.                 xmlHttp.onreadystatechange = handleStateChange;  
  25.                 xmlHttp.open("GET", "json.txt", true);  
  26.                 xmlHttp.send(null);  
  27.             }  
  28.             catch(exception)  
  29.             {  
  30.                 alert("xmlHttp Fail");  
  31.             }  
  32.         }  
  33.  
  34.         function handleStateChange()  
  35.         {      
  36.             if(xmlHttp.readyState == 4)  
  37.             {          
  38.                 if (xmlHttp.status == 200 || xmlHttp.status == 0)  
  39.                 {  
  40.                     var result = xmlHttp.responseText;  
  41.                     var json = eval("(" + result + ")");  
  42.                     alert(json.programmers[0].firstName + ',' + json.programmers[0].lastName + ',' + json.programmers[0].email);  
  43.                     alert(json.programmers[1].firstName + ',' + json.programmers[1].lastName + ',' + json.programmers[1].email);  
  44.                     alert(json.programmers[2].firstName + ',' + json.programmers[2].lastName + ',' + json.programmers[2].email);  
  45.  
  46.                     alert(json.authors[0].firstName + ',' + json.authors[0].lastName + ',' + json.authors[0].genre);  
  47.                     alert(json.authors[1].firstName + ',' + json.authors[1].lastName + ',' + json.authors[1].genre);  
  48.                     alert(json.authors[2].firstName + ',' + json.authors[2].lastName + ',' + json.authors[2].genre);  
  49.  
  50.                     alert(json.musicians[0].firstName + ',' + json.musicians[0].lastName + ',' + json.musicians[0].instrument);  
  51.                     alert(json.musicians[1].firstName + ',' + json.musicians[1].lastName + ',' + json.musicians[1].instrument);  
  52.                 }  
  53.             }  
  54.         }  
  55.         </script> 
  56.     </head> 
  57.     <body> 
  58.         <div> 
  59.             <input type="button" value="JSON Test" onclick="startRequest();" /> 
  60.         </div> 
  61.     </body> 
  62. </html> 

 

3.2Java对象转换为JSON字符串

3.2.1        功能描述

   在该实例中,讲述如何将Java构造的复杂对象转换为JSON字符串,Pagination对象中包含int类型的pageNo属性,还包括List列表类型的resultList中包括的又是Book类型的对象,Book对象包括简单类型的属性idname,也包括List对象authors,表示该书的多个作者信息。authors列表的对象包含idname属性。

   我们构造一个Pagination类型的分页对象,它包含两本书Book对象,分别为《人生若只如初见》和《海边的卡夫卡》,并设置了它们的作者等信息。

3.2.2        建立工程,并将包引入

   在Eclipse中建立一个jsonStudyJava工程或Java Web工程,在src目录下建立com.amigo.json包,用来放置本示例的Java代码。

   另外转换时需要用到一些包,需要将其放到lib目录下,所需的包如下图所示:

   

   commons系列的包,可在网站:http://www.docjar.com/上面搜索下载,其它包可下载网站如下:

   json-lib-2.2-jdk15.jarhttp://json-lib.sourceforge.net/

   ezmorph.jar      http://ezmorph.sourceforge.net/

   morph-1.0.1.jar   http://morph.sourceforge.net/

3.2.3        JavaBean对象

   Author类:   Book类:   Pagination类:3.2.4        测试类

 
  1. package com.amigo.json;  
  2.  
  3. public class Author {  
  4.     private String id;  
  5.  
  6.     private String name;  
  7.  
  8.     // 省略getter/setter方法  

 

 
  1. package com.amigo.json;  
  2.  
  3. import java.util.List;  
  4.  
  5. public class Book {  
  6.     private String id;  
  7.  
  8.     private String name;  
  9.  
  10.     private List<Author> authors;  
  11.  
  12.     // 省略getter/setter方法  

 

 
  1. package com.amigo.json;  
  2.  
  3. import java.util.List;  
  4.  
  5. public class Pagination {  
  6.     private int pageNo;  
  7.  
  8.     private List<Object> results;  
  9.  
  10.     // 省略getter/setter方法  

 

   JsonTest测试类:

  

 
  1. package com.amigo.json;  
  2.  
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7. import net.sf.json.JSONArray;   
  8. import net.sf.json.JSONObject;  
  9.  
  10. public class JsonTest {  
  11.     /** *//**  
  12.      * @param args  
  13.      */ 
  14.     public static void main(String[] args) {   
  15.         // 当是对象的时候  
  16.         Author author = new Author();  
  17.         author.setId("1");  
  18.         author.setName("张三");   
  19.         JSONObject jsonObject = JSONObject.fromObject(author);   
  20.         System.out.println(jsonObject);  
  21.  
  22.         // 当是数组或list的时候  
  23.         Author[] authors = new Author[5];   
  24.         List<Author> authorsList = new ArrayList<Author>();   
  25.         for (int i = 0; i < authors.length; i++) {   
  26.             authors[i] = new Author();   
  27.             authors[i].setId(String.valueOf(i + 1));   
  28.             authors[i].setName("张三" + (i + 1));  
  29.             // 添加到list  
  30.             authorsList.add(authors[i]);   
  31.         }   
  32.         JSONArray jsonArray = JSONArray.fromObject(authorsList);   
  33.         System.out.println(jsonArray);  
  34.  
  35.         jsonArray = JSONArray.fromObject(authors);  
  36.         System.out.println(jsonArray);  
  37.  
  38.         // 复杂结构构造  
  39.         Map<String,Object> map = new HashMap<String,Object>();   
  40.         Pagination pagination = new Pagination();  
  41.         pagination.setPageNo(1);  
  42.         pagination.setResults(new ArrayList<Object>());  
  43.  
  44.         // 构造第一个book的信息  
  45.         Book book = new Book();  
  46.         book.setId("1");  
  47.         book.setName("人生若只如初见");  
  48.         book.setAuthors(new ArrayList<Author>());  
  49.         pagination.getResults().add(book);  
  50.  
  51.         author = new Author();  
  52.         author.setId("1");  
  53.         author.setName("张三");  
  54.         book.getAuthors().add(author);  
  55.           
  56.         author = new Author();  
  57.         author.setId("2");  
  58.         author.setName("李四");  
  59.         book.getAuthors().add(author);  
  60.  
  61.         // 构造第二个book的信息  
  62.         Book book2 = new Book();  
  63.         book2.setId("2");  
  64.         book2.setName("海边的卡夫卡");  
  65.         book2.setAuthors(new ArrayList<Author>());  
  66.         author = new Author();  
  67.         author.setId("1");  
  68.         author.setName("村上春树");  
  69.         book2.getAuthors().add(author);  
  70.         pagination.getResults().add(book2);  
  71.  
  72.         map.put("page", pagination);  
  73.  
  74.         JSONObject jsonObjectFromMap = JSONObject.fromObject(map);   
  75.         System.out.println(jsonObjectFromMap);  
  76.     }  

 

 

3.2.5        运行结果

   运行JsonText.java,运行结果如下:

 
  1. {"id":"1","name":"张三"}  
  2.  
  3. [{"id":"1","name":"张三1"},{"id":"2","name":"张三2"},{"id":"3","name":"张三3"},{"id":"4","name":"张三4"},{"id":"5","name":"张三5"}]  
  4.  
  5. [{"id":"1","name":"张三1"},{"id":"2","name":"张三2"},{"id":"3","name":"张三3"},{"id":"4","name":"张三4"},{"id":"5","name":"张三5"}]  
  6.  
  7. {"page":{"pageNo":1,"results":[{"authors":[{"id":"1","name":"张三"},{"id":"2","name":"李四"}],"id":"1","name":"人生若只如初见"},{"authors":[{"id":"1","name":"村上春树"}],"id":"2","name":"海边的卡夫卡"}]}}  

 

  该实例Map复合结构的格式化的JSON字符串为:

 
  1. {  
  2. "page":  
  3.     {"pageNo":1,  
  4.      "results":  
  5.         [{  
  6.          "authors":  
  7.               [  
  8.                {"id":"1""name":"张三"},  
  9.                {"id":"2""name":"李四"}  
  10.               ],  
  11.          "id":"1",  
  12.          "name":"人生若只如初见" 
  13.          },  
  14.          {  
  15.          "authors":  
  16.                [  
  17.                 {"id":"1","name":"村上春树"}  
  18.                ],  
  19.           "id":"2",  
  20.           "name":"海边的卡夫卡" 
  21.           }]  
  22.      }  

 

 

4.     常见问题

4.1中文乱码问题说明

   在3.1的实例中,为了避免中文乱码问题,需要注意以下两点:

1)json.html中添加如下一句:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

2)使用UE等保存json.txt文件时,需要将其保存为UTF-8模式。

4.2java.lang.NoClassDefFoundError:net/sf/ezmorph/Morpher异常

3.2的实例中,当笔者没有将ezmorph.jarmorph-1.0.1.jar包导入时,虽然类都没有报错,但是运行时抛出java.lang.NoClassDefFoundError:net/sf/ezmorph/Morpher异常,如果读者也出现该异常,需要将这没有加入的包加入到工程中。

 


原文地址 :  http://www.fengfly.com/plus/view-190705-1.html
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值