Jackson常用方法以及jacksonUtil工具类和回顾JSON数据格式回顾

来源:互联网 发布:windows找不到cdm 编辑:程序博客网 时间:2024/05/20 01:12

  项目中我们通常使用ajax返回json数据格式的形式进行前后端数据交互,所以会用到Java数据json数据互相转化,通常我们的做法是在项目中创建一个工具类进行转化处理。如下:我的demo包含了项目中常用的jacksonUtil类,以及常用的JSON JAVA处理数据转化处理方法。

  

实体类book:

[java] view plain copy
  1. package test.entity;  
  2.   
  3. public class Book {  
  4.     private int bookId;//书的ID  
  5.     private String author;//作者  
  6.     private String name;//书名  
  7.     private int price;//书价  
  8.   
  9.     public int getBookId() {  
  10.         return bookId;  
  11.     }  
  12.   
  13.     public void setBookId(int bookId) {  
  14.         this.bookId = bookId;  
  15.     }  
  16.   
  17.     public String getAuthor() {  
  18.         return author;  
  19.     }  
  20.   
  21.     public void setAuthor(String author) {  
  22.         this.author = author;  
  23.     }  
  24.   
  25.     public String getName() {  
  26.         return name;  
  27.     }  
  28.   
  29.     public void setName(String name) {  
  30.         this.name = name;  
  31.     }  
  32.   
  33.     public int getPrice() {  
  34.         return price;  
  35.     }  
  36.   
  37.     public void setPrice(int price) {  
  38.         this.price = price;  
  39.     }  
  40.   
  41.     @Override  
  42.     public String toString() {  
  43.         return "Book [bookId=" + bookId + ", author=" + author + ", name="  
  44.                 + name + ", price=" + price + "]";  
  45.     }  
  46.   
  47. }  

jackson以及相关jar包对java以及json数据的具体处理方法,JackSonDemo类。

[java] view plain copy
  1. package test.jackson;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.Arrays;  
  6. import java.util.HashMap;  
  7. import java.util.Iterator;  
  8. import java.util.List;  
  9. import java.util.Map;  
  10. import java.util.Set;  
  11.   
  12. import org.junit.After;  
  13. import org.junit.Before;  
  14. import org.junit.Test;  
  15.   
  16. import test.entity.Book;  
  17.   
  18. import com.fasterxml.jackson.core.JsonEncoding;  
  19. import com.fasterxml.jackson.core.JsonGenerator;  
  20. import com.fasterxml.jackson.core.JsonParseException;  
  21. import com.fasterxml.jackson.databind.JsonMappingException;  
  22. import com.fasterxml.jackson.databind.ObjectMapper;  
  23.   
  24. public class JackSonDemo {  
  25.     private JsonGenerator jsonGenerator = null;  
  26.     private ObjectMapper objectMapper = null;  
  27.     private Book book = null;  
  28.   
  29.     /** 
  30.      * Junit的方法,用于给每个单元测试添加前置条件和结束条件 
  31.      */  
  32.     @Before  
  33.     public void init() {  
  34.         // 构建一个Book实例对象并赋值  
  35.         book = new Book();  
  36.         book.setAuthor("海明威");  
  37.         book.setBookId(123);  
  38.         book.setName("老人与海");  
  39.         book.setPrice(30);  
  40.         objectMapper = new ObjectMapper();  
  41.         try {  
  42.             jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(  
  43.                     System.out, JsonEncoding.UTF8);  
  44.         } catch (IOException e) {  
  45.             e.printStackTrace();  
  46.         }  
  47.     }  
  48.   
  49.     @After  
  50.     public void destory() {  
  51.         try {  
  52.             if (jsonGenerator != null) {  
  53.                 jsonGenerator.flush();  
  54.             }  
  55.             if (!jsonGenerator.isClosed()) {  
  56.                 jsonGenerator.close();  
  57.             }  
  58.             jsonGenerator = null;  
  59.             objectMapper = null;  
  60.             book = null;  
  61.             System.gc();  
  62.         } catch (IOException e) {  
  63.             e.printStackTrace();  
  64.         }  
  65.     }  
  66.   
  67.     /********************** java常见数据类型转JSON ****************************/  
  68.     /** 
  69.      * 1.javaBean转化成json---两种方法writeObject/writeValue均可 
  70.      * jsonGenerator依赖于ObjectMapper创建 
  71.      */  
  72.     @Test  
  73.     public void javaBeanToJson() {  
  74.   
  75.         try {  
  76.             System.out.println("jsonGenerator");  
  77.             // 方法一  
  78.             jsonGenerator.writeObject(book);  
  79.             System.out.println();  
  80.   
  81.             System.out.println("ObjectMapper");  
  82.             // 方法二  
  83.             objectMapper.writeValue(System.out, book);  
  84.   
  85.         } catch (IOException e) {  
  86.             e.printStackTrace();  
  87.         }  
  88.     }  
  89.   
  90.     /** 
  91.      * List转化成JSON,三种方式 
  92.      */  
  93.     @Test  
  94.     public void listToJson() {  
  95.         try {  
  96.             List<Book> list = new ArrayList<Book>();  
  97.             Book bookOne = new Book();  
  98.             bookOne.setAuthor("安徒生");  
  99.             bookOne.setBookId(456);  
  100.             bookOne.setName("安徒生童话");  
  101.             bookOne.setPrice(55);  
  102.             Book bookTwo = new Book();  
  103.             bookTwo.setAuthor("安徒生");  
  104.             bookTwo.setBookId(456);  
  105.             bookTwo.setName("安徒生童话");  
  106.             bookTwo.setPrice(55);  
  107.             list.add(bookOne);  
  108.             list.add(bookTwo);  
  109.             // 方式一  
  110.             System.out.println("方式一jsonGenerator");  
  111.             jsonGenerator.writeObject(list);  
  112.             System.out.println();  
  113.             System.out.println("方式二ObjectMapper");  
  114.             // 方式二  
  115.             System.out.println(objectMapper.writeValueAsString(list));  
  116.             // 方式三  
  117.             System.out.println("方式三直接通过objectMapper的writeValue方法:");  
  118.             objectMapper.writeValue(System.out, list);  
  119.         } catch (IOException e) {  
  120.             e.printStackTrace();  
  121.         }  
  122.     }  
  123.   
  124.     /** 
  125.      * map转化成JSON,两种方式 
  126.      */  
  127.     @Test  
  128.     public void mapToJSON() {  
  129.         try {  
  130.             Map<String, Object> map = new HashMap<String, Object>();  
  131.             map.put("name", book.getName());  
  132.             map.put("book", book);  
  133.             Book newBook = new Book();  
  134.             newBook.setAuthor("安徒生");  
  135.             newBook.setBookId(456);  
  136.             newBook.setName("安徒生童话");  
  137.             newBook.setPrice(55);  
  138.             map.put("newBook", newBook);  
  139.   
  140.             System.out.println("第一种方式jsonGenerator");  
  141.             jsonGenerator.writeObject(map);  
  142.             System.out.println("");  
  143.   
  144.             System.out.println("第二种方式objectMapper");  
  145.             objectMapper.writeValue(System.out, map);  
  146.         } catch (IOException e) {  
  147.             e.printStackTrace();  
  148.         }  
  149.     }  
  150.   
  151.     /*********************** JSON数据类型转java数据 ********************************/  
  152.     /** 
  153.      * json'对象'数据转化成javaBean 
  154.      */  
  155.     @Test  
  156.     public void jsonToJavaBean() {  
  157.         String json = "{\"bookId\":\"11111\",\"author\":\"鲁迅\",\"name\":\"朝花夕拾\",\"price\":\"45\"}";  
  158.         try {  
  159.             Book book = objectMapper.readValue(json, Book.class);  
  160.             System.out.println(book);  
  161.         } catch (JsonParseException e) {  
  162.             e.printStackTrace();  
  163.         } catch (JsonMappingException e) {  
  164.             e.printStackTrace();  
  165.         } catch (IOException e) {  
  166.             e.printStackTrace();  
  167.         }  
  168.     }  
  169.   
  170.     /** 
  171.      * json'数组'数据转化为ArrayList 
  172.      */  
  173.     @Test  
  174.     public void jsonToArrayList() {  
  175.         String json = "[{\"bookId\":\"11111\",\"author\":\"鲁迅\",\"name\":\"朝花夕拾\",\"price\":\"45\"},"  
  176.                 + "{\"bookId\":\"11111\",\"author\":\"鲁迅\",\"name\":\"朝花夕拾\",\"price\":\"45\"}]";  
  177.         try {  
  178.             Book[] book = objectMapper.readValue(json, Book[].class);  
  179.             for (int i = 0; i < book.length; i++) {  
  180.                 // 注意book[i]仅仅是数组,需要通过Arrays.asList()方法转为ArrayList  
  181.                 List<Book> list = Arrays.asList(book[i]);  
  182.                 System.out.println(list);  
  183.   
  184.             }  
  185.   
  186.         } catch (JsonParseException e) {  
  187.             e.printStackTrace();  
  188.         } catch (JsonMappingException e) {  
  189.             e.printStackTrace();  
  190.         } catch (IOException e) {  
  191.             e.printStackTrace();  
  192.         }  
  193.     }  
  194.   
  195.     /** 
  196.      * json转换成map 
  197.      */  
  198.     @Test  
  199.     public void JsonToMap() {  
  200.         String json = "{\"name\":\"book\",\"number\":\"12138\",\"book1\":{\"bookId\":\"11111\",\"author\":\"鲁迅\",\"name\":\"朝花夕拾\",\"price\":\"45\"},"  
  201.                 + "\"book2\":{\"bookId\":\"22222\",\"author\":\"易中天\",\"name\":\"祖先\",\"price\":\"25\"}}";  
  202.         try {  
  203.             Map<String, Map<String, Object>> maps = objectMapper.readValue(  
  204.                     json, Map.class);  
  205.             Set<String> key = maps.keySet();  
  206.             Iterator<String> iter = key.iterator();  
  207.             while (iter.hasNext()) {  
  208.                 String field = iter.next();  
  209.                 System.out.println(field + ":" + maps.get(field));  
  210.             }  
  211.         } catch (JsonParseException e) {  
  212.             e.printStackTrace();  
  213.         } catch (JsonMappingException e) {  
  214.             e.printStackTrace();  
  215.         } catch (IOException e) {  
  216.             e.printStackTrace();  
  217.         }  
  218.     }  
  219. }  

最后,是我们在实际开发项目中使用的jacksonUtil类,应用起来很简单,直接jacksonUtil.bean2Json(Object object)(bean转JSON)或者jacksonUtil.json2Bean(Object object)(JSON转bean)

[java] view plain copy
  1. package test.util;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.StringWriter;  
  5.   
  6. import com.fasterxml.jackson.core.JsonFactory;  
  7. import com.fasterxml.jackson.core.JsonGenerator;  
  8. import com.fasterxml.jackson.core.JsonParseException;  
  9. import com.fasterxml.jackson.databind.JsonMappingException;  
  10. import com.fasterxml.jackson.databind.ObjectMapper;  
  11.   
  12. /** 
  13.  * bean转json格式或者json转bean格式, 项目中我们通常使用这个工具类进行json---java互相转化 
  14.  */  
  15. public class JacksonUtil {  
  16.     private static ObjectMapper mapper = new ObjectMapper();  
  17.   
  18.     public static String bean2Json(Object obj) throws IOException {  
  19.         StringWriter sw = new StringWriter();  
  20.         JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);  
  21.         mapper.writeValue(gen, obj);  
  22.         gen.close();  
  23.         return sw.toString();  
  24.     }  
  25.   
  26.     public static <T> T json2Bean(String jsonStr, Class<T> objClass)  
  27.             throws JsonParseException, JsonMappingException, IOException {  
  28.         return mapper.readValue(jsonStr, objClass);  
  29.     }  
  30. }  




  常见的价格核心包:如下!
          
       

  详见: http://www.yiibai.com/jackson/jackson_streaming_api.html



  回顾JSON数据格式
    

   在学习AJAX的过程中,接触了一种新的数据格式——Json数据格式,一开始不是很明白,后来通过做一个“股票”的小程序,有了些了解,下面是我的总结(并非"股票"例子程序),希望对大家有所帮助。


,概念

(1)一种轻量级的数据交换格式;

(2)纯文本格式,JavaScript原生支持;

 

,XML格式比较:

虽然Ajax的定义中有XML,但是很多应用中会选用json格式来进行数据交换;


(1)XML格式的优势:因为是javascript的原生支持,所以它在JavaScript里面去解析式非常快的,可

以迅速的把json的文本格式转换成javascript里的对象或数组,不需要用DOM,如果是XML则还需要

DOM来解析,而DOM的操作在不同的浏览器中还是存在着一些小的差异的,并且在IE这种浏览器中DOM操作的效率也不是很好;


(2)XML格式的缺点:XML已经是很成熟的数据格式了,各种各样的应用都在使用XML,所以无论是在任

何一种服务器端语言里,都有很成熟的辅助的开源包/平台自己提供的包去操作XML的数据,去生成XML

式的数据,但是Json,这方面的成熟度还相对较低,虽然随着Ajax技术的发展和流行,很多服务器端语言

也都有了一些开源包去来做Json格式数据的生成,但是和json相比成熟度还是很低的。

 

,例子


(1)简单认识


右边的Json数据格式中的内容——

中括号[]:代表数组;

大括号{}:用来定义对象;——右边json格式的数据,每个大括号{}就对应一个book对象,所以共3book对象; isdnauthornameprive均是对象book的属性;


(2)小应用


如果从服务器端返回的一个json数据格式最终代表的是数组,可以直接用eval()的方式去对它进行一个执

行,返回成一个javascript数组;


如果json数据格式对应的是一个对象的话,则必须要在它的外层加上"("   ")",再用eval()方法执行;

[html] view plain copy
  1. <html>  
  2.     <head>  
  3.         <title></title>  
  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  5.         <script type="text/javascript">   
  6.               
  7.            function jsonTest(){  
  8.                  
  9.              //JSON数据格式定义(Json无非就是一个数组或者一个对象)  
  10.              //定义一个Json数据格式的数据,并赋值给json1  
  11.              var json1="[1,2,{" +   
  12.                      "a:123,b:'String',c:[100,1001]" +  
  13.              "}]";  
  14.               
  15.              var jsonArray = eval(json1);//返回一个包含3个元素的数组  
  16.              alert(jsonArray[0]);//显示数组jsonArray的第1个元素  
  17.              alert(jsonArray[1]);//显示jsonArray的第2个元素  
  18.              alert(jsonArray[2].a);//显示jsonarray的第3个元素(是个对象)的a属性  
  19.              alert(jsonArray[2].b);//显示jsonarray的第3个元素(是个对象)的b属性  
  20.              alert(jsonArray[2].c);//显示jsonarray的第3个元素(是个对象)的c属性  
  21.                
  22.             //定义一个Json数据格式的数据,并赋值给json2  
  23.              var json2="{" +   
  24.                      "a:'Hello',b:'[1,2,3]',c:function(){alert(\"Hi!!!\")}" +            
  25.                "}";  
  26.              var jsonObj=eval("("+ json2 + ")");//返回一个对象——此对象包含a、b属性和c()函数  
  27.              alert(jsonObj.a);//显示jsonObj对象的属性a的值  
  28.              alert(jsonObj.b);//显示jsonObj对象的属性b的值  
  29.              jsonObj.c();  //调用jsonObj对象的c()函数  
  30.            }  
  31.         </script>  
  32.     </head>  
  33.     <body>  
  34.        <input type="button" value="JSON示例" onclick="jsonTest()" />  
  35.     </body>  
  36. </html>  

IE调试窗口:看变量值


 点击查看运行结果


四,总结:

(1)了解:Json数据格式是怎样一个形式;

(2)掌握:如果从服务器端接受到了Json数据后,怎么把它转换成Javascript中的数组/对象——使用eval()方法

(注:客户端使用responseText接收服务器端返回的Json数据)

(3)JSON数据格式定义(Json无非就是一个数组或者一个对象)





原创粉丝点击