<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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社區(qū)相對比較活躍,更新速度也比較快。

    一、準備工作

    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的創(chuàng)建依賴于ObjectMapper對象。也就是說如果你要使用 JsonGenerator來轉換JSON,那么你必須創(chuàng)建一個ObjectMapper。但是你用ObjectMapper來轉換JSON,則不需要 JSONGenerator。

    objectMapper的writeValue方法可以將一個Java對象轉換成JSON。這個方法的參數一,需要提供一個輸出流,轉換后 可以通過這個流來輸出轉換后的內容?;蚴翘峁┮粋€File,將轉換后的內容寫入到File中。當然,這個參數也可以接收一個JSONGenerator, 然后通過JSONGenerator來輸出轉換后的信息。第二個參數是將要被轉換的Java對象。如果用三個參數的方法,那么是一個Config。這個 config可以提供一些轉換時的規(guī)則,過指定的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>
    看結果,根節(jié)點都是unknown 這個問題還沒有解決,由于根節(jié)點沒有轉換出來,所有導致解析xml到Java對象,也無法完成。
    posted on 2012-09-06 16:41 SIMONE 閱讀(14197) 評論(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如何做呢?能否給個例子?  回復  更多評論
      
    主站蜘蛛池模板: 亚洲AV区无码字幕中文色| 亚洲人成人一区二区三区| 亚洲色成人中文字幕网站| 亚洲国产成人在线视频| 人妻巨大乳hd免费看| 久久久久高潮毛片免费全部播放| 精品久久久久久久免费人妻| 亚洲妇熟XXXX妇色黄| 亚洲AV无码之国产精品| 日韩视频免费在线观看| 国产免费看插插插视频| 337p欧洲亚洲大胆艺术| 特黄特色大片免费| 成人免费在线看片| 亚洲宅男天堂在线观看无病毒| 亚洲中文字幕AV每天更新| 免费久久人人爽人人爽av| 日本免费一区二区三区最新vr| 亚洲av不卡一区二区三区| 国产精品亚洲专区无码不卡| 永久在线免费观看| 亚洲无线码在线一区观看| 亚洲国产精品成人综合色在线| 最近最新高清免费中文字幕| 久久久久久亚洲精品不卡| 亚洲精品无码人妻无码| 99热这里有免费国产精品| 久久久久亚洲精品男人的天堂| 亚洲国产精品日韩av不卡在线 | 19禁啪啪无遮挡免费网站| 亚洲人成人无码网www国产| 亚洲午夜无码久久久久小说 | 人人玩人人添人人澡免费| 亚洲 国产 图片| 亚洲人成色4444在线观看| 91久久青青草原线免费| 亚洲国产精品一区第二页| 一级**爱片免费视频| 免费**毛片在线播放直播| 亚洲AV成人一区二区三区在线看| 97免费人妻在线视频|