posts - 495,comments - 227,trackbacks - 0

          http://www.open-open.com/lib/view/open1327992553405.html


          Jackson可以輕松的將Java對象轉換成json對象和xml文檔,同樣也可以將json、xml轉換成Java對象。

          前面有介紹過json-lib這個框架,在線博文:http://www.open-open.com/lib/view/open1327991992093.html

          相比json-lib框架,Jackson所依賴的jar包較少,簡單易用并且性能也要相對高些。而且Jackson社區相對比較活躍,更新速度也比較快。

          一、準備工作

          1、 下載依賴庫jar包

          Jackson的jar all下載地址:http://jackson.codehaus.org/1.7.6/jackson-all-1.7.6.jar

          然后在工程中導入這個jar包即可開始工作

          官方示例:http://wiki.fasterxml.com/JacksonInFiveMinutes

          因為下面的程序是用junit測試用例運行的,所以還得添加junit的jar包。版本是junit-4.2.8

          如果你需要轉換xml,那么還需要stax2-api.jar

          2、 測試類基本代碼如下

          package com.hoo.test;
           
          import java.io.IOException;
          import java.io.StringWriter;
          import java.util.ArrayList;
          import java.util.HashMap;
          import java.util.Iterator;
          import java.util.LinkedHashMap;
          import java.util.List;
          import java.util.Map;
          import java.util.Set;
          import org.codehaus.jackson.JsonEncoding;
          import org.codehaus.jackson.JsonGenerationException;
          import org.codehaus.jackson.JsonGenerator;
          import org.codehaus.jackson.JsonParseException;
          import org.codehaus.jackson.map.JsonMappingException;
          import org.codehaus.jackson.map.ObjectMapper;
          import org.codehaus.jackson.node.JsonNodeFactory;
          import org.codehaus.jackson.xml.XmlMapper;
          import org.junit.After;
          import org.junit.Before;
          import org.junit.Test;
          import com.hoo.entity.AccountBean;
           
          /**
           * <b>function:</b>Jackson 將java對象轉換成JSON字符串,也可以將JSON字符串轉換成java對象
           * jar-lib-version: jackson-all-1.6.2
           * jettison-1.0.1
           * @author hoojo
           * @createDate 2010-11-23 下午04:54:53
           * @file JacksonTest.java
           * @package com.hoo.test
           * @project Spring3
           * @blog http://blog.csdn.net/IBM_hoojo
           * @email hoojo_@126.com
           * @version 1.0
           */
          @SuppressWarnings("unchecked")
          public class JacksonTest {
              private JsonGenerator jsonGenerator = null;
              private ObjectMapper objectMapper = null;
              private AccountBean bean = null;
              
              @Before
              public void init() {
                  bean = new AccountBean();
                  bean.setAddress("china-Guangzhou");
                  bean.setEmail("hoojo_@126.com");
                  bean.setId(1);
                  bean.setName("hoojo");
                  
                  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;
                      bean = null;
                      System.gc();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }

          3、 所需要的JavaEntity

          package com.hoo.entity;
           
          public class AccountBean {
              private int id;
              private String name;
              private String email;
              private String address;
              private Birthday birthday;
              
              //getter、setter
              
              @Override
              public String toString() {
                  return this.name + "#" + this.id + "#" + this.address + "#" + this.birthday + "#" + this.email;
              }
          }

          Birthday

          package com.hoo.entity;
           
          public class Birthday {
              private String birthday;
              
              public Birthday(String birthday) {
                  super();
                  this.birthday = birthday;
              }
           
              //getter、setter
           
              public Birthday() {}
              
              @Override
              public String toString() {
                  return this.birthday;
              }
          }

          二、Java對象轉換成JSON

          1、 JavaBean(Entity/Model)轉換成JSON

          /**
           * <b>function:</b>將java對象轉換成json字符串
           * @author hoojo
           * @createDate 2010-11-23 下午06:01:10
           */
          @Test
          public void writeEntityJSON() {
              
              try {
                  System.out.println("jsonGenerator");
                  //writeObject可以轉換java對象,eg:JavaBean/Map/List/Array等
                  jsonGenerator.writeObject(bean);    
                  System.out.println();
                  
                  System.out.println("ObjectMapper");
                  //writeValue具有和writeObject相同的功能
                  objectMapper.writeValue(System.out, bean);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

          運行后結果如下:

          jsonGenerator
          {"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}
          ObjectMapper
          {"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}

          上面分別利用JsonGenerator的writeObject方法和ObjectMapper的writeValue方法完成對Java 對象的轉換,二者傳遞的參數及構造的方式不同;JsonGenerator的創建依賴于ObjectMapper對象。也就是說如果你要使用 JsonGenerator來轉換JSON,那么你必須創建一個ObjectMapper。但是你用ObjectMapper來轉換JSON,則不需要 JSONGenerator。

          objectMapper的writeValue方法可以將一個Java對象轉換成JSON。這個方法的參數一,需要提供一個輸出流,轉換后 可以通過這個流來輸出轉換后的內容。或是提供一個File,將轉換后的內容寫入到File中。當然,這個參數也可以接收一個JSONGenerator, 然后通過JSONGenerator來輸出轉換后的信息。第二個參數是將要被轉換的Java對象。如果用三個參數的方法,那么是一個Config。這個 config可以提供一些轉換時的規則,過指定的Java對象的某些屬性進行過濾或轉換等。

          2、 將Map集合轉換成Json字符串

          /**
           * <b>function:</b>將map轉換成json字符串
           * @author hoojo
           * @createDate 2010-11-23 下午06:05:26
           */
          @Test
          public void writeMapJSON() {
              try {
                  Map<String, Object> map = new HashMap<String, Object>();
                  map.put("name", bean.getName());
                  map.put("account", bean);
                  bean = new AccountBean();
                  bean.setAddress("china-Beijin");
                  bean.setEmail("hoojo@qq.com");
                  map.put("account2", bean);
                  
                  System.out.println("jsonGenerator");
                  jsonGenerator.writeObject(map);
                  System.out.println("");
                  
                  System.out.println("objectMapper");
                  objectMapper.writeValue(System.out, map);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

          轉換后結果如下:

          jsonGenerator
          {"account2":{"address":"china-Beijin","name":null,"id":0,"birthday":null,"email":"hoojo@qq.com"},"name":"hoojo",
          "account":{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}}
          objectMapper
          {"account2":{"address":"china-Beijin","name":null,"id":0,"birthday":null,"email":"hoojo@qq.com"},"name":"hoojo",
          "account":{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}}

          3、 將List集合轉換成json

          /**
           * <b>function:</b>將list集合轉換成json字符串
           * @author hoojo
           * @createDate 2010-11-23 下午06:05:59
           */
          @Test
          public void writeListJSON() {
              try {
                  List<AccountBean> list = new ArrayList<AccountBean>();
                  list.add(bean);
                  
                  bean = new AccountBean();
                  bean.setId(2);
                  bean.setAddress("address2");
                  bean.setEmail("email2");
                  bean.setName("haha2");
                  list.add(bean);
                  
                  System.out.println("jsonGenerator");
                  //list轉換成JSON字符串
                  jsonGenerator.writeObject(list);
                  System.out.println();
                  System.out.println("ObjectMapper");
                  //用objectMapper直接返回list轉換成的JSON字符串
                  System.out.println("1###" + objectMapper.writeValueAsString(list));
                  System.out.print("2###");
                  //objectMapper list轉換成JSON字符串
                  objectMapper.writeValue(System.out, list);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

          結果如下:

          jsonGenerator
          [{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"},
          {"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}]
          ObjectMapper
          1###[{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"},
          {"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}]
          2###[{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"},
          {"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}]

          外面就是多了個[]中括號;同樣Array也可以轉換,轉換的JSON和上面的結果是一樣的,這里就不再轉換了。~.~

          4、下面來看看jackson提供的一些類型,用這些類型完成json轉換;如果你使用這些類型轉換JSON的話,那么你即使沒有 JavaBean(Entity)也可以完成復雜的Java類型的JSON轉換。下面用到這些類型構建一個復雜的Java對象,并完成JSON轉換。

          @Test
          public void writeOthersJSON() {
              try {
                  String[] arr = { "a", "b", "c" };
                  System.out.println("jsonGenerator");
                  String str = "hello world jackson!";
                  //byte
                  jsonGenerator.writeBinary(str.getBytes());
                  //boolean
                  jsonGenerator.writeBoolean(true);
                  //null
                  jsonGenerator.writeNull();
                  //float
                  jsonGenerator.writeNumber(2.2f);
                  //char
                  jsonGenerator.writeRaw("c");
                  //String
                  jsonGenerator.writeRaw(str, 5, 10);
                  //String
                  jsonGenerator.writeRawValue(str, 5, 5);
                  //String
                  jsonGenerator.writeString(str);
                  jsonGenerator.writeTree(JsonNodeFactory.instance.POJONode(str));
                  System.out.println();
                  
                  //Object
                  jsonGenerator.writeStartObject();//{
                  jsonGenerator.writeObjectFieldStart("user");//user:{
                  jsonGenerator.writeStringField("name", "jackson");//name:jackson
                  jsonGenerator.writeBooleanField("sex", true);//sex:true
                  jsonGenerator.writeNumberField("age", 22);//age:22
                  jsonGenerator.writeEndObject();//}
                  
                  jsonGenerator.writeArrayFieldStart("infos");//infos:[
                  jsonGenerator.writeNumber(22);//22
                  jsonGenerator.writeString("this is array");//this is array
                  jsonGenerator.writeEndArray();//]
                  
                  jsonGenerator.writeEndObject();//}
                  
                  
                  AccountBean bean = new AccountBean();
                  bean.setAddress("address");
                  bean.setEmail("email");
                  bean.setId(1);
                  bean.setName("haha");
                  //complex Object
                  jsonGenerator.writeStartObject();//{
                  jsonGenerator.writeObjectField("user", bean);//user:{bean}
                  jsonGenerator.writeObjectField("infos", arr);//infos:[array]
                  jsonGenerator.writeEndObject();//}
                  
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }

          運行后,結果如下:

          jsonGenerator
          "aGVsbG8gd29ybGQgamFja3NvbiE=" true null 2.2c world jac  worl "hello world jackson!" "hello world jackson!"
           {"user":{"name":"jackson","sex":true,"age":22},"infos":[22,"this is array"]} 
          {"user":{"address":"address","name":"haha","id":1,"birthday":null,"email":"email"},"infos":["a","b","c"]}

          怎么樣?構造的json字符串和輸出的結果是一致的吧。關鍵看懂用JSONGenerator提供的方法,完成一個Object的構建。

          三、JSON轉換成Java對象

          1、 將json字符串轉換成JavaBean對象

          @Test
          public void readJson2Entity() {
              String json = "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}";
              try {
                  AccountBean acc = objectMapper.readValue(json, AccountBean.class);
                  System.out.println(acc.getName());
                  System.out.println(acc);
              } catch (JsonParseException e) {
                  e.printStackTrace();
              } catch (JsonMappingException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

          很簡單,用到了ObjectMapper這個對象的readValue這個方法,這個方法需要提供2個參數。第一個參數就是解析的JSON字 符串,第二個參數是即將將這個JSON解析吃什么Java對象,Java對象的類型。當然,還有其他相同簽名方法,如果你有興趣可以一一嘗試使用方法,當 然使用的方法和當前使用的方法大同小異。運行后,結果如下:

          haha
          haha#1#address#null#email

          2、 將json字符串轉換成List<Map>集合

          /**
           * <b>function:</b>json字符串轉換成list<map>
           * @author hoojo
           * @createDate 2010-11-23 下午06:12:01
           */
          @Test
          public void readJson2List() {
              String json = "[{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+
                          "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}]";
              try {
                  List<LinkedHashMap<String, Object>> list = objectMapper.readValue(json, List.class);
                  System.out.println(list.size());
                  for (int i = 0; i < list.size(); i++) {
                      Map<String, Object> map = list.get(i);
                      Set<String> set = map.keySet();
                      for (Iterator<String> it = set.iterator();it.hasNext();) {
                          String key = it.next();
                          System.out.println(key + ":" + map.get(key));
                      }
                  }
              } catch (JsonParseException e) {
                  e.printStackTrace();
              } catch (JsonMappingException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

          嘗試過將上面的JSON轉換成List,然后List中存放AccountBean,但結果失敗了。但是支持Map集合。因為你轉成List.class,但是不知道List存放何種類型。只好默然Map類型。因為所有的對象都可以轉換成Map結合,運行后結果如下:

          2
          address:address2
          name:haha2
          id:2
          email:email2
          address:address
          name:haha
          id:1
          email:email

          3、 Json字符串轉換成Array數組,由于上面的泛型轉換不能識別到集合中的對象類型。所有這里用對象數組,可以解決這個問題。只不過它不再是集合,而是一個數組。當然這個不重要,你可以用Arrays.asList將其轉換成List即可。

          /**
           * <b>function:</b>json字符串轉換成Array
           * @author hoojo
           * @createDate 2010-11-23 下午06:14:01
           */
          @Test
          public void readJson2Array() {
              String json = "[{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+
                      "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}]";
              try {
                  AccountBean[] arr = objectMapper.readValue(json, AccountBean[].class);
                  System.out.println(arr.length);
                  for (int i = 0; i < arr.length; i++) {
                      System.out.println(arr[i]);
                  }
                  
              } catch (JsonParseException e) {
                  e.printStackTrace();
              } catch (JsonMappingException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

          運行后的結果:

          2
          haha2#2#address2#null#email2
          haha#1#address#null#email

          4、 Json字符串轉換成Map集合

          /**
           * <b>function:</b>json字符串轉換Map集合
           * @author hoojo
           * @createDate Nov 27, 2010 3:00:06 PM
           */
          @Test
          public void readJson2Map() {
              String json = "{\"success\":true,\"A\":{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+
                          "\"B\":{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}}";
              try {
                  Map<String, Map<String, Object>> maps = objectMapper.readValue(json, Map.class);
                  System.out.println(maps.size());
                  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();
              }
          }

          運行后結果如下:

          3
          success:true
          A:{address=address2, name=haha2, id=2, email=email2}
          B:{address=address, name=haha, id=1, email=email}

          四、JacksonXML的支持

          Jackson也可以完成java對象到xml的轉換,轉換后的結果要比json-lib更直觀,不過它依賴于stax2-api.jar這個jar包。

          /**
           * <b>function:</b>java對象轉換成xml文檔
           * 需要額外的jar包 stax2-api.jar
           * @author hoojo
           * @createDate 2010-11-23 下午06:11:21
           */
          @Test
          public void writeObject2Xml() {
              //stax2-api-3.0.2.jar
              System.out.println("XmlMapper");
              XmlMapper xml = new XmlMapper();
              
              try {
                  //javaBean轉換成xml
                  //xml.writeValue(System.out, bean);
                  StringWriter sw = new StringWriter();
                  xml.writeValue(sw, bean);
                  System.out.println(sw.toString());
                  //List轉換成xml
                  List<AccountBean> list = new ArrayList<AccountBean>();
                  list.add(bean);
                  list.add(bean);
                  System.out.println(xml.writeValueAsString(list));
                  
                  //Map轉換xml文檔
                  Map<String, AccountBean> map = new HashMap<String, AccountBean>();
                  map.put("A", bean);
                  map.put("B", bean);
                  System.out.println(xml.writeValueAsString(map));
              } catch (JsonGenerationException e) {
                  e.printStackTrace();
              } catch (JsonMappingException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

          運行上面的方法,結果如下:

          XmlMapper
          <unknown><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/><email>hoojo_@126.com</email></unknown>
          <unknown><unknown><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/><email>hoojo_@126.com</email></unknown>
          <email><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/><email>hoojo_@126.com</email></email></unknown>
          <unknown><A><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/><email>hoojo_@126.com</email></A>
          <B><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/><email>hoojo_@126.com</email></B></unknown>
          看結果,根節點都是unknown 這個問題還沒有解決,由于根節點沒有轉換出來,所有導致解析xml到Java對象,也無法完成。
          posted on 2012-09-06 16:41 SIMONE 閱讀(14200) 評論(1)  編輯  收藏 所屬分類: JAVA

          FeedBack:
          # re: jackson的使用總結 一
          2014-05-15 22:02 | zhangxiaoqiang
          您好!
          我的json是個本地文件,格式如下:
          [
          {
          "PID":"4094851",
          "KIND_CODE":"4094851",
          "NAME_GROUPID":"1",
          "NAME_CLASS":"1",
          "NAME_TYPE":"1",
          "LANG_CODE":"CHI",
          "NAME":"南京利豐英和商貿公司北京分公司",
          "NAME_PHONETIC":"NanJingLiFengYingHeShangMaoGongSiBeiJingFenGongSi",
          "KEYWORDS":"",
          "NIDB_PID":"110014392930000",
          "KEYWORDS_AIF":"NanJing|LiFengYingHeShangMao|GongSi|BeiJing|Fen|GongSi"
          },
          {
          "PID":"4094852",
          "KIND_CODE":"4094852",
          "NAME_GROUPID":"1",
          "NAME_CLASS":"1",
          "NAME_TYPE":"1",
          "LANG_CODE":"CHI",
          "NAME":"南京利稀里嘩啦京分公司",
          "NAME_PHONETIC":"NanJingLiFengYingHeShangMaoGongSiBeiJingFenGongSi",
          "KEYWORDS":"",
          "NIDB_PID":"110014392930000",
          "KEYWORDS_AIF":"NanJing|LiFengYingHeShangMao|GongSi|BeiJing|Fen|GongSi"
          }
          ]
          有幾十萬條記錄,我想解析入到oracle庫里,請問jackson如何做呢?能否給個例子?  回復  更多評論
            
          主站蜘蛛池模板: 句容市| 乐至县| 铅山县| 凭祥市| 花垣县| 鄂尔多斯市| 尉氏县| 雷波县| 错那县| 青川县| 景德镇市| 平度市| 葫芦岛市| 缙云县| 剑阁县| 柳州市| 巧家县| 明光市| 南宫市| 赫章县| 虹口区| 桃园县| 舞阳县| 南皮县| 柘荣县| 商丘市| 宜君县| 铜山县| 申扎县| 南皮县| 木兰县| 将乐县| 郓城县| 招远市| 太康县| 盐津县| 惠东县| 盈江县| 丰县| 五莲县| 建昌县|