Jackson 框架, 轻易 转换 JSON - hoojo - 博客 园

Jackson, Java, Java, json, xml, son, json, xml, 成 Java, son.

Son 有 介绍 json-lib 框架 博 文: http: //www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html

Son json-lib Jackson Jackson 所 依赖 的 jar 而且 而且 而且 性能 也要 也要 而且 而且 而且 Jackson 社区 相对 比较 活跃, 更新 速度 也 比较 快.

一、准备工作

1, ar 依赖 库 jar 包

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

Ar 在 工程 中 导入 这个 jar 包 即可 开始 工作

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

Junit-jar ar. 版本 是 junit-4.2.8

Ax 你 需要 ml xml, 那么 还 需要 stax2-api.jar

2、 测试类基本代码如下

paquet 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.Avant;
import org.junit.Test;
import com.hoo.entity.AccountBean;
 
/**
 * <b> fonction: </ b> Jackson ava java 对象 成 JSON 字符串, SON 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
 * @projet Spring3
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
@SuppressWarnings ("non vérifié")
classe publique JacksonTest {
 JsonGenerator privé jsonGenerator = null;
 ObjectMapper privé objectMapper = null;
 bean AccountBean privé = null;
 
 @Avant
 public void init () {
 bean = new AccountBean ();
 bean.setAddress ("Chine-Guangzhou");
 bean.setEmail ("hoojo_@126.com");
 bean.setId (1);
 bean.setName ("hoojo");
 
 objectMapper = new ObjectMapper ();
 essayez {
 jsonGenerator = objectMapper.getJsonFactory (). createJsonGenerator (System.out, JsonEncoding.UTF8);
 } catch (IOException e) {
 e.printStackTrace ();
 }
 }
 
 @Après
 destrier public vide () {
 essayez {
 if (jsonGenerator! = null) {
 jsonGenerator.flush ();
 }
 if (! jsonGenerator.isClosed ()) {
 jsonGenerator.close ();
 }
 jsonGenerator = null;
 objectMapper = null;
 haricot = nul;
 System.gc ();
 } catch (IOException e) {
 e.printStackTrace ();
 }
 }
}

3, Java 需要 的 JavaEntity

paquet com.hoo.entity;
 
classe publique AccountBean {
 private int id;
 nom de chaîne privé;
 email de chaîne privé;
 Adresse de chaîne privée;
 anniversaire d'anniversaire privé;
 
 // getter, setter
 
 @Passer outre
 public String toString () {
 retourner this.name + "#" + this.id + "#" + this.address + "#" + this.birthday + "#" + this.email;
 }
}

Anniversaire

paquet com.hoo.entity;
 
classe publique Anniversaire {
 anniversaire privé de cordes;
 
 Anniversaire public (Anniversaire) {
 super();
 this.birthday = anniversaire;
 }
 
 // getter, setter
 
 Anniversaire public () {}
 
 @Passer outre
 public String toString () {
 retourne ce.anniversaire;
 }
}

Java, Java 对象 转换 Java JSON

1, JavaBean (entité / modèle) SON SON JSON

/**
 * <b> fonction: </ b> java 对象 对象 json 字符串
 * @author hoojo
 * @createDate 2010-11-23 下午 06:01:10
 */
@Tester
écriture publique videEntityJSON () {
 
 essayez {
 System.out.println ("jsonGenerator");
 // writeObject 可以 ava java 对象, par exemple: 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 a écrit un objet sur ObjectMapper WriteValue, Java, JsonGenator, ObjectMapper, JsonGenerator, JSON,个 er 用 个 M ObjectMapper. 用 你 ObjectMapper 来 JSON, 不需要 不需要 JSONGenerator.

objectMapper 的 writeValue 个 个 个 一个 Java 对象 成 JSON. 个 方法 可以 一 一 输出 输出 转换 个 个 个, 个 提供 一个到 到 fichier 中. 当然, 这个 参数 也 个 一个 JSONGenerator, S S Java 是 Java Java Java Java Java, 个 个 一个 Config . Ig config 可以 些 一些 转换 时 的 规则, Java Java 的 Java.

2, 将 Carte 集合 转换 成 Json 字符串

/**
 * <b> fonction: </ b> 将 carte 转换 son json 字符串
 * @author hoojo
 * @createDate 2010-11-23 下午 06:05:26
 */
@Tester
écriture publique videMapJSON () {
 essayez {
 Map <String, Object> map = new HashMap <String, Object> ();
 map.put ("name", bean.getName ());
 map.put ("compte", 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> fonction: </ b> 将 liste 集合 转换 成 json 字符串
 * @author hoojo
 * @ createDate 2010-11-23 下午 06:05:59
 */
@Tester
écriture publique videListJSON () {
 essayez {
 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");
 // liste 转换 成 JSON 字符串
 jsonGenerator.writeObject (liste);
 System.out.println ();
 System.out.println ("ObjectMapper");
 // 用 objectMapper 直接 返回 liste 转换 成 的 JSON 字符串
 System.out.println ("1 ###" + objectMapper.writeValueAsString (liste));
 System.out.print ("2 ###");
 // liste objectMapper 转换 SON JSON 字符串
 objectMapper.writeValue (System.out, liste);
 } catch (IOException e) {
 e.printStackTrace ();
 }
}

结果如下:

jsongenerator
[{"adresse": "Chine-Guangzhou", "nom": "hoojo", "id": 1, "anniversaire": 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"}]

Ray 就是 多 了 个 [] 中 括号; 同样 Array 也 转换 转换 转换 不再 转换 ~. ~. ~

4, son son son jackson 提供 的 一些 类型, 用 这些 完成 json 转换; Java 类型 构建 一个 复杂 的 Java 对象, 并 完成 JSON 转换.

@Tester
écriture publique videOthersJSON () {
 essayez {
 String [] arr = {"a", "b", "c"};
 System.out.println ("jsonGenerator");
 String str = "hello world jackson!";
 //octet
 jsonGenerator.writeBinary (str.getBytes ());
 // booléen
 jsonGenerator.writeBoolean (true);
 //nul
 jsonGenerator.writeNull ();
 //flotte
 jsonGenerator.writeNumber (2.2f);
 //carboniser
 jsonGenerator.writeRaw ("c");
 //Chaîne
 jsonGenerator.writeRaw (str, 5, 10);
 //Chaîne
 jsonGenerator.writeRawValue (str, 5, 5);
 //Chaîne
 jsonGenerator.writeString (str);
 jsonGenerator.writeTree (JsonNodeFactory.instance.POJONode (str));
 System.out.println ();
 
 //Objet
 jsonGenerator.writeStartObject (); // {
 jsonGenerator.writeObjectFieldStart ("user"); // utilisateur: {
 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"); // ceci est un tableau
 jsonGenerator.writeEndArray (); //]
 
 jsonGenerator.writeEndObject (); //}
 
 
 AccountBean bean = new AccountBean ();
 bean.setAddress ("address");
 bean.setEmail ("email");
 bean.setId (1);
 bean.setName ("haha");
 // objet complexe
 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 monde monde "bonjour monde jackson!" "Bonjour le monde jackson!"
 {"user": {"name": "jackson", "sex": true, "age": 22}, "infos": [22, "ceci est un tableau"]} 
{"utilisateur": {"adresse": "adresse", "nom": "haha", "id": 1, "anniversaire": null, "email": "email"}, "infos": ["a ","avant JC"]}

S 样? 构造 的 json S 输出 输出 的 结果 一致 的 吧. S 看懂 JSONGenerator ator 的 个, 完成 一个 Object 的 构建.

SON, JSON 转换 成 Java 对象

1, son json 字符串 转换 B JavaBean 对象

@Tester
public void readJson2Entity () {
 String json = "{\" adresse \ ": \" adresse \ ", \" nom \ ": \" haha ​​\ ", \" id \ ": 1, \" email \ ": \" email \ "}" ;
 essayez {
 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 ();
 }
}

M 简单, 了 了 ObjectMapper M read read 个 个, SON SON 参数 个 个 将 SON JSON, Java 什么, Java Java, 参数 什么, 对象 简单 read read 对象,类型. 当然, 还有 其他 相同 签名 方法, 如果 你 有 兴趣 一 一一 尝试 使用 方法, 当然 使用, 结果 如下:

haha
haha # 1 # adresse # null # email

2, son json 字符串 转换 成 Liste <Carte> 集合

/**
 * <b> fonction: </ b> json 字符串 转换 成 list <map>
 * @author hoojo
 * @createDate 2010-11-23 下午 06:12:01
 */
@Tester
public void readJson2List () {
 String json = "[{\" adresse \ ": \" adresse2 \ ", \" nom \ ": \" haha2 \ ", \" id \ ": 2, \" email \ ": \" email2 \ "} , "+
 "{\" adresse \ ": \" adresse \ ", \" nom \ ": \" haha ​​\ ", \" id \ ": 1, \" email \ ": \" email \ "}]";
 essayez {
 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 (clé + ":" + map.get (clé));
 }
 }
 } catch (JsonParseException e) {
 e.printStackTrace ();
 } catch (JsonMappingException e) {
 e.printStackTrace ();
 } catch (IOException e) {
 e.printStackTrace ();
 }
}

SON 过 将 上面 的 JSON 成 成 List, 然后 Liste 存放 B AccountBean, 了 结果 失败 支持 支持 支持 Map 支持. 因为 你 转 List.class, 知道 不 知道 List 存放 何种 类型. Carte 结合, 运行 后 结果 如下:

2
adresse: adresse2
nom: haha2
id: 2
email: email2
adresse adresse
nom: haha
id: 1
email: email

3, Json ray 成 Array 数组, 由于 上面 的 泛型 不能 识别 到 集合 中 的 对象 类型. 所有 这里 用 对象 数组, 可以 解决 这个 问题.不重要 不重要, 你 可以 用 Arrays.asList 将 其 转换 成 Liste 即可.

/**
 * <b> fonction: </ b> json 字符串 转换 成 Array
 * @author hoojo
 * @createDate 2010-11-23 下午 06:14:01
 */
@Tester
public void readJson2Array () {
 String json = "[{\" adresse \ ": \" adresse2 \ ", \" nom \ ": \" haha2 \ ", \" id \ ": 2, \" email \ ": \" email2 \ "} , "+
 "{\" adresse \ ": \" adresse \ ", \" nom \ ": \" haha ​​\ ", \" id \ ": 1, \" email \ ": \" email \ "}]";
 essayez {
 AccountBean [] arr = objectMapper.readValue (json, AccountBean []. Class);
 System.out.println (arr.length);
 pour (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 # adresse2 # null # email2
haha # 1 # adresse # null # email

4, Json 成 转换 成 Map 集合

/**
 * <b> fonction: </ b> json 转换 转换 carte 集合
 * @author hoojo
 * @ createDate 27 novembre 2010 15:00:06
 */
@Tester
public void readJson2Map () {
 String json = "{\" success \ ": true, \" A \ ": {\" adresse \ ": \" adresse2 \ ", \" nom \ ": \" haha2 \ ", \" id \ ": 2, \ "email \": \ "email2 \"}, "+
 "\" B \ ": {\" adresse \ ": \" adresse \ ", \" nom \ ": \" haha ​​\ ", \" id \ ": 1, \" email \ ": \" email \ "}}";
 essayez {
 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 ()) {
 Champ de chaîne = iter.next ();
 System.out.println (champ + ":" + maps.get (champ));
 }
 } catch (JsonParseException e) {
 e.printStackTrace ();
 } catch (JsonMappingException e) {
 e.printStackTrace ();
 } catch (IOException e) {
 e.printStackTrace ();
 }
}

运行后结果如下:

3
succès: vrai
A: {address = address2, name = haha2, id = 2, email = email2}
B: {adresse = adresse, nom = haha, id = 1, email = email}

Jackson, Jackson 对 XML 的 支持

Jackson Jackson java ml xml 的 转换, son 后 的 要比 json-lib 直观 不过 它 ax stax2-api.jar ar jar 包.

/**
 * <b> fonction: </ b> java 对象 转换 成 xml 文档
 * 需要 额外 的 jar ax stax2-api.jar
 * @author hoojo
 * @createDate 2010-11-23 下午 06:11:21
 */
@Tester
public void writeObject2Xml () {
 //stax2-api-3.0.2.jar
 System.out.println ("XmlMapper");
 XmlMapper xml = new XmlMapper ();
 
 essayez {
 // javaBean 转换 成 xml
 //xml.writeValue(System.out, bean);
 StringWriter sw = new StringWriter ();
 xml.writeValue (sw, bean);
 System.out.println (sw.toString ());
 // Liste 转换 成 xml
 List <AccountBean> list = new ArrayList <AccountBean> ();
 list.add (bean);
 list.add (bean);
 System.out.println (xml.writeValueAsString (liste));
 
 // Carte ml xml 文档
 Map <String, AccountBean> map = new HashMap <String, AccountBean> ();
 map.put ("A", bean);
 map.put ("B", haricot);
 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 这个 根节点 问题 还 解决, 由于 根节点 没有 转换 出来, ml 导致 xml ml Java 对象, 也 无法 完成.

4.4
Note utilisateur: 23
5
15
4
1
3
3
2
3
1
0