Jackson常用方法以及jacksonUtil工具类和回顾JSON数据格式回顾
来源:互联网 发布:windows找不到cdm 编辑:程序博客网 时间:2024/05/20 01:12
项目中我们通常使用ajax返回json数据格式的形式进行前后端数据交互,所以会用到Java数据json数据互相转化,通常我们的做法是在项目中创建一个工具类进行转化处理。如下:我的demo包含了项目中常用的jacksonUtil类,以及常用的JSON JAVA处理数据转化处理方法。
实体类book:
- package test.entity;
- public class Book {
- private int bookId;//书的ID
- private String author;//作者
- private String name;//书名
- private int price;//书价
- public int getBookId() {
- return bookId;
- }
- public void setBookId(int bookId) {
- this.bookId = bookId;
- }
- public String getAuthor() {
- return author;
- }
- public void setAuthor(String author) {
- this.author = author;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getPrice() {
- return price;
- }
- public void setPrice(int price) {
- this.price = price;
- }
- @Override
- public String toString() {
- return "Book [bookId=" + bookId + ", author=" + author + ", name="
- + name + ", price=" + price + "]";
- }
- }
jackson以及相关jar包对java以及json数据的具体处理方法,JackSonDemo类。
- package test.jackson;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import test.entity.Book;
- import com.fasterxml.jackson.core.JsonEncoding;
- import com.fasterxml.jackson.core.JsonGenerator;
- import com.fasterxml.jackson.core.JsonParseException;
- import com.fasterxml.jackson.databind.JsonMappingException;
- import com.fasterxml.jackson.databind.ObjectMapper;
- public class JackSonDemo {
- private JsonGenerator jsonGenerator = null;
- private ObjectMapper objectMapper = null;
- private Book book = null;
- /**
- * Junit的方法,用于给每个单元测试添加前置条件和结束条件
- */
- @Before
- public void init() {
- // 构建一个Book实例对象并赋值
- book = new Book();
- book.setAuthor("海明威");
- book.setBookId(123);
- book.setName("老人与海");
- book.setPrice(30);
- objectMapper = new ObjectMapper();
- try {
- jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(
- System.out, JsonEncoding.UTF8);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- @After
- public void destory() {
- try {
- if (jsonGenerator != null) {
- jsonGenerator.flush();
- }
- if (!jsonGenerator.isClosed()) {
- jsonGenerator.close();
- }
- jsonGenerator = null;
- objectMapper = null;
- book = null;
- System.gc();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /********************** java常见数据类型转JSON ****************************/
- /**
- * 1.javaBean转化成json---两种方法writeObject/writeValue均可
- * jsonGenerator依赖于ObjectMapper创建
- */
- @Test
- public void javaBeanToJson() {
- try {
- System.out.println("jsonGenerator");
- // 方法一
- jsonGenerator.writeObject(book);
- System.out.println();
- System.out.println("ObjectMapper");
- // 方法二
- objectMapper.writeValue(System.out, book);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * List转化成JSON,三种方式
- */
- @Test
- public void listToJson() {
- try {
- List<Book> list = new ArrayList<Book>();
- Book bookOne = new Book();
- bookOne.setAuthor("安徒生");
- bookOne.setBookId(456);
- bookOne.setName("安徒生童话");
- bookOne.setPrice(55);
- Book bookTwo = new Book();
- bookTwo.setAuthor("安徒生");
- bookTwo.setBookId(456);
- bookTwo.setName("安徒生童话");
- bookTwo.setPrice(55);
- list.add(bookOne);
- list.add(bookTwo);
- // 方式一
- System.out.println("方式一jsonGenerator");
- jsonGenerator.writeObject(list);
- System.out.println();
- System.out.println("方式二ObjectMapper");
- // 方式二
- System.out.println(objectMapper.writeValueAsString(list));
- // 方式三
- System.out.println("方式三直接通过objectMapper的writeValue方法:");
- objectMapper.writeValue(System.out, list);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * map转化成JSON,两种方式
- */
- @Test
- public void mapToJSON() {
- try {
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("name", book.getName());
- map.put("book", book);
- Book newBook = new Book();
- newBook.setAuthor("安徒生");
- newBook.setBookId(456);
- newBook.setName("安徒生童话");
- newBook.setPrice(55);
- map.put("newBook", newBook);
- System.out.println("第一种方式jsonGenerator");
- jsonGenerator.writeObject(map);
- System.out.println("");
- System.out.println("第二种方式objectMapper");
- objectMapper.writeValue(System.out, map);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /*********************** JSON数据类型转java数据 ********************************/
- /**
- * json'对象'数据转化成javaBean
- */
- @Test
- public void jsonToJavaBean() {
- String json = "{\"bookId\":\"11111\",\"author\":\"鲁迅\",\"name\":\"朝花夕拾\",\"price\":\"45\"}";
- try {
- Book book = objectMapper.readValue(json, Book.class);
- System.out.println(book);
- } catch (JsonParseException e) {
- e.printStackTrace();
- } catch (JsonMappingException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * json'数组'数据转化为ArrayList
- */
- @Test
- public void jsonToArrayList() {
- String json = "[{\"bookId\":\"11111\",\"author\":\"鲁迅\",\"name\":\"朝花夕拾\",\"price\":\"45\"},"
- + "{\"bookId\":\"11111\",\"author\":\"鲁迅\",\"name\":\"朝花夕拾\",\"price\":\"45\"}]";
- try {
- Book[] book = objectMapper.readValue(json, Book[].class);
- for (int i = 0; i < book.length; i++) {
- // 注意book[i]仅仅是数组,需要通过Arrays.asList()方法转为ArrayList
- List<Book> list = Arrays.asList(book[i]);
- System.out.println(list);
- }
- } catch (JsonParseException e) {
- e.printStackTrace();
- } catch (JsonMappingException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * json转换成map
- */
- @Test
- public void JsonToMap() {
- String json = "{\"name\":\"book\",\"number\":\"12138\",\"book1\":{\"bookId\":\"11111\",\"author\":\"鲁迅\",\"name\":\"朝花夕拾\",\"price\":\"45\"},"
- + "\"book2\":{\"bookId\":\"22222\",\"author\":\"易中天\",\"name\":\"祖先\",\"price\":\"25\"}}";
- try {
- Map<String, Map<String, Object>> maps = objectMapper.readValue(
- json, Map.class);
- Set<String> key = maps.keySet();
- Iterator<String> iter = key.iterator();
- while (iter.hasNext()) {
- String field = iter.next();
- System.out.println(field + ":" + maps.get(field));
- }
- } catch (JsonParseException e) {
- e.printStackTrace();
- } catch (JsonMappingException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
最后,是我们在实际开发项目中使用的jacksonUtil类,应用起来很简单,直接jacksonUtil.bean2Json(Object object)(bean转JSON)或者jacksonUtil.json2Bean(Object object)(JSON转bean)
- package test.util;
- import java.io.IOException;
- import java.io.StringWriter;
- import com.fasterxml.jackson.core.JsonFactory;
- import com.fasterxml.jackson.core.JsonGenerator;
- import com.fasterxml.jackson.core.JsonParseException;
- import com.fasterxml.jackson.databind.JsonMappingException;
- import com.fasterxml.jackson.databind.ObjectMapper;
- /**
- * bean转json格式或者json转bean格式, 项目中我们通常使用这个工具类进行json---java互相转化
- */
- public class JacksonUtil {
- private static ObjectMapper mapper = new ObjectMapper();
- public static String bean2Json(Object obj) throws IOException {
- StringWriter sw = new StringWriter();
- JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);
- mapper.writeValue(gen, obj);
- gen.close();
- return sw.toString();
- }
- public static <T> T json2Bean(String jsonStr, Class<T> objClass)
- throws JsonParseException, JsonMappingException, IOException {
- return mapper.readValue(jsonStr, objClass);
- }
- }
在学习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对象,所以共3个book对象; isdn、author、name、prive均是对象book的属性;
(2)小应用
如果从服务器端返回的一个json数据格式最终代表的是数组,可以直接用eval()的方式去对它进行一个执
行,返回成一个javascript数组;
如果json数据格式对应的是一个对象的话,则必须要在它的外层加上"(" ")",再用eval()方法执行;
- <html>
- <head>
- <title></title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <script type="text/javascript">
- function jsonTest(){
- //JSON数据格式定义(Json无非就是一个数组或者一个对象)
- //定义一个Json数据格式的数据,并赋值给json1
- var json1="[1,2,{" +
- "a:123,b:'String',c:[100,1001]" +
- "}]";
- var jsonArray = eval(json1);//返回一个包含3个元素的数组
- alert(jsonArray[0]);//显示数组jsonArray的第1个元素
- alert(jsonArray[1]);//显示jsonArray的第2个元素
- alert(jsonArray[2].a);//显示jsonarray的第3个元素(是个对象)的a属性
- alert(jsonArray[2].b);//显示jsonarray的第3个元素(是个对象)的b属性
- alert(jsonArray[2].c);//显示jsonarray的第3个元素(是个对象)的c属性
- //定义一个Json数据格式的数据,并赋值给json2
- var json2="{" +
- "a:'Hello',b:'[1,2,3]',c:function(){alert(\"Hi!!!\")}" +
- "}";
- var jsonObj=eval("("+ json2 + ")");//返回一个对象——此对象包含a、b属性和c()函数
- alert(jsonObj.a);//显示jsonObj对象的属性a的值
- alert(jsonObj.b);//显示jsonObj对象的属性b的值
- jsonObj.c(); //调用jsonObj对象的c()函数
- }
- </script>
- </head>
- <body>
- <input type="button" value="JSON示例" onclick="jsonTest()" />
- </body>
- </html>
在IE调试窗口:看变量值
点击查看运行结果
四,总结:
(1)了解:Json数据格式是怎样一个形式;
(2)掌握:如果从服务器端接受到了Json数据后,怎么把它转换成Javascript中的数组/对象——使用eval()方法
(注:客户端使用responseText接收服务器端返回的Json数据)
(3)JSON数据格式定义(Json无非就是一个数组或者一个对象)
- Jackson常用方法以及jacksonUtil工具类和回顾JSON数据格式回顾
- Jackson常用方法以及jacksonUtil工具类
- Collections工具类方法回顾以及自定义实现
- 数组和方法回顾
- JDBCUtil工具类回顾
- HibernateUtil工具类回顾
- 回顾-Json
- JSON回顾
- Java基础回顾 : 文件类中的一些常用的方法
- 回顾
- 回顾
- 回顾
- 回顾
- 回顾
- 回顾
- 回顾
- 回顾
- 回顾
- 喷水装置(二)
- poj 1741 点分治
- 天气预报实时显示系统设计
- F
- 【HDU-2037】 今年暑假不AC
- Jackson常用方法以及jacksonUtil工具类和回顾JSON数据格式回顾
- 深入浅出ARKit
- 访问修饰符protected
- MIT《计算机科学数学》Chaper02-The Well Ordering Principle
- 在beeline中插入数据是提示权限不足
- react-native-vector-icons的使用
- 25年、博士、C\/C++程序员的告白:多年来代码依然存在bug
- sockaddr_in结构体详解
- lnmp下的mysql