Jackson

来源:互联网 发布:macpro软件卸不掉 编辑:程序博客网 时间:2024/06/06 04:10

Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。

前面有介绍过json-lib这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html

相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。

一、准备工作

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

如果是首次使用该jar包还可以阅读官方的示例:http://wiki.fasterxml.com/JacksonInFiveMinutes

github:https://github.com/FasterXML/jackson-core
当然该jar包还有许多其他的很多强大的api,大家可以自行学习

二、JSON转换成Java对象

**除此之外,objectMapper.readValue还可以从字符串、Reade、File、URL、InputStream、Byte数组中读取JSON;
详情查看博客:http://blog.csdn.net/maoyeqiu/article/details/50490249
- 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对象的类型。当然,还有其他相同签名方法,如果你有兴趣可以一一尝试使用方法,当然使用的方法和当前使用的方法大同小异。运行后,结果如下:

hahahaha#1#address#null#email
  • 2、 将json字符串转换成List集合
/** * <b>function:</b>json字符串转换成list<map> * @author hoojo * @createDate 2010-11-23 下午06:12:01 */@Testpublic 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类型

运行结果:

2address:address2name:haha2id:2email:email2address:addressname:hahaid:1email:email
  • 3、 Json字符串转换成Array数组

    由于上面的泛型转换不能识别到集合中的对象类型。所有这里用对象数组,可以解决这个问题。只不过它不再是集合,而是一个数组。当然这个不重要,你可以用Arrays.asList将其转换成List即可。

/** * <b>function:</b>json字符串转换成Array * @author hoojo * @createDate 2010-11-23 下午06:14:01 */@Testpublic 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();    }}

运行后的结果:

2haha2#2#address2#null#email2haha#1#address#null#email
  • 4、 Json字符串转换成Map集合
/** * <b>function:</b>json字符串转换Map集合 * @author hoojo * @createDate Nov 27, 2010 3:00:06 PM */@Testpublic 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();    }}

运行后结果如下:

3success:trueA:{address=address2, name=haha2, id=2, email=email2}B:{address=address, name=haha, id=1, email=email}
  • 5、Jackson将json字符串转换成泛型List(或map)

Jackson,我感觉是在Java与Json之间相互转换的最快速的框架,当然Google的Gson也很不错,但是参照网上有人的性能测试,看起来还是Jackson比较快一点

Jackson处理一般的JavaBean和Json之间的转换只要使用ObjectMapper 对象的readValue和writeValueAsString两个方法就能实现。但是如果要转换复杂类型Collection如 List,那么就需要先反序列化复杂类型 为泛型的Collection Type。

如果是ArrayList<YourBean>那么使用ObjectMapper 的getTypeFactory().constructParametricType(collectionClass, elementClasses);如果是HashMap<String,YourBean>那么 ObjectMapper 的getTypeFactory().constructParametricType(HashMap.class,String.class, YourBean.class);

方法一:

String jsonString="[{'id':'1'},{'id':'2'}]";  ObjectMapper mapper = new ObjectMapper();  JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, Bean.class);  //如果是Map类型   //mapper.getTypeFactory().constructParametricType(HashMap.class,String.class, Bean.class);  List<Bean> lst =  (List<Bean>)mapper.readValue(jsonString, javaType); 

方法二:

String jsonString="[{'id':'1'},{'id':'2'}]";  ObjectMapper mapper = new ObjectMapper();  List<Bean> beanList = mapper.readValue(jsonString, new TypeReference<List<Bean>>() {}); 

方法三:

     public final ObjectMapper mapper = new ObjectMapper();      public static void main(String[] args) throws Exception{           JavaType javaType = getCollectionType(ArrayList.class, YourBean.class);          List<YourBean> lst =  (List<YourBean>)mapper.readValue(jsonString, javaType);      }           /**            * 获取泛型的Collection Type           * @param collectionClass 泛型的Collection            * @param elementClasses 元素类            * @return JavaType Java类型            * @since 1.0            */        public static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {            return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);        }   

三、Java对象转换成JSON

博客地址:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html


四、Jackson对XML的支持

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 */@Testpublic 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对象,也无法完成。