定义
Json-lib 是一个 Java 类库(官网:http://json-lib.sourceforge.net/)。提供将Java对象,包括beans, maps, collections, java arrays 和 XML等转换成JSON格式数据,或者反向转换的功能,将 json 格式数据转换为 javabeans 对象。
所需jar包
- commons-beanutils-1.8.3.jar
- commons-collections-3.2.1.jar
- commons-lang-2.6.jar
- commons-logging-1.1.1.jar
- ezmorph-1.0.6.jar
- json-lib-2.4-jdk15.jar
主要API
JSONObject.fromObject()
Map、自定义类型是用JSONObject解析 。可以将Map理解成一个对象,里面的key/value对可以理解成对象的属性/属性值 即{key1:value1,key2,value2……}
JSONArray.fromObject()
普通类型、List、Collection等都是用JSONArray解析
jsonObject.toBean
将json字符串转为对象
案例
普通类型转换成JSON
/**
* @author NowUSeeMe
*/
@Test
public void CommonType2Json(){
Integer myInt = 11;
System.out.println("用JSONObject转换普通整型(包装类):"+JSONObject.fromObject(myInt)); //{}
System.out.println("用JSONArray转换普通整型(包装类):"+JSONArray.fromObject(myInt)); //[11]
boolean flag = false;
System.out.println("用JSONObject转换普通布尔类型:"+JSONObject.fromObject(flag)); //{}
System.out.println("用JSONArray转换普通布尔类型:"+JSONArray.fromObject(flag)); //[false]
}
@Test
public void JsonStr2Json(){
String str = "['json','is','easy']";
JSONArray jsonArray = JSONArray.fromObject(str);
System.out.println("jsonArray:" + jsonArray ); //jsonArray:["json","is","easy"]
}
数组转换成JSON
/**
* @author NowUSeeMe
*/
@Test
public void Array2Json(){
boolean[] boolArray = new boolean[]{true, false, true};
JSONArray jsonArray = JSONArray.fromObject(boolArray);
System.out.println("Array2Json:" + jsonArray);//Array2Json:[true,false,true]
}
数组转换成JSON
/**
* @author NowUSeeMe
*/
@Test
public void List2Json(){
List<String> list = new ArrayList<String>();
list.add("NowUSeeMe");
list.add("LXX");
JSONArray jsonArray = JSONArray.fromObject(list);
System.out.println("List2Json:" + jsonArray); //List2Json:["NowUSeeMe","LXX"]
}
Map转换成JSON
@Test
public void Map2Json(){
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "NowUSeeMe");
map.put("age", 20);
map.put("isMan", true);
map.put( "bool", Boolean.TRUE );
map.put( "int", new Integer(1) );
map.put( "arr", new String[]{"a","b"} );
map.put( "func", "function(i){ return this.arr[i]; }" );
JSONObject jsonObject = JSONObject.fromObject(map);
System.out.println("Map2Json"+jsonObject);
System.out.println("从JsonObject中取出数组:"+jsonObject.optString("arr"));
System.out.println("从JsonObject中根据key取出value:" + jsonObject.get("age"));
}
运行结果:
Map2Json{"arr":["a","b"],"int":1,"age":20,"name":"NowUSeeMe","func":function(i){ return this.arr[i]; },"bool":true,"isMan":true}
从JsonObject中取出数组:["a","b"]
从JsonObject中根据key取出value:20
复杂Bean转Json
Card.java
public class Card {
private Integer id;
private String cardName;
private String cardNum;
private String cardHolder;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCardName() {
return cardName;
}
public void setCardName(String cardName) {
this.cardName = cardName;
}
public String getCardNum() {
return cardNum;
}
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
public String getCardHolder() {
return cardHolder;
}
public void setCardHolder(String cardHolder) {
this.cardHolder = cardHolder;
}
}
Account.java
import java.util.Date;
import java.util.List;
public class Account{
private String userName;
private Integer age;
private Date createTime;
private List<Card> cards;
public Account(){};
public Account(String userName, Integer age, Date createTime){
this.userName = userName;
this.age = age;
this.createTime = createTime;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public List<Card> getCards() {
return cards;
}
public void setCards(List<Card> cards) {
this.cards = cards;
}
}
测试:
/**
* @author NowUSeeMe
*/
@Test
public void ComplexBean2Json(){
Card card1 = new Card();
card1.setId(1);
card1.setCardName("中国工商银行");
card1.setCardNum("123456789");
card1.setCardHolder("nowu");
Card card2 = new Card();
card2.setId(2);
card2.setCardName("中国农业银行");
card2.setCardNum("845612345");
card2.setCardHolder("seeme");
List<Card> cards = new ArrayList<Card>();
cards.add(card1);
cards.add(card2);
Account complexBean = new Account();
complexBean.setUserName("accountName");
complexBean.setAge(20);
complexBean.setCards(cards);
complexBean.setCreateTime(new Date());
JSONObject jsonObject = JSONObject.fromObject(complexBean); //这里JSONObject(推荐) JSONArray都可以
System.out.println(jsonObject);
}
运行结果:
{"age":20,"cards":[{"cardHolder":"nowu","cardName":"中国工商银行","cardNum":"123456789","id":1},{"cardHolder":"seeme","cardName":"中国农业银行","cardNum":"845612345","id":2}],"createTime":{"date":18,"day":6,"hours":13,"minutes":27,"month":1,"seconds":40,"time":1487395660727,"timezoneOffset":-480,"year":117},"userName":"accountName"}
增加忽略的属性
若是觉得以上结果太杂,想要自定义序列化的结果,有两种方法:
1. 可以在想要序列化的实体类Account.java
中实现JsonString接口并实现该接口方法,在该方法中自定义序列化。
2. 过jsonconfig实例,对包含和需要排除的属性进行方便的添加或删除
方法1:序列化的Bean实现JsonString接口
修改Account.java
package com.myjsonlib.demo2;
import java.util.Date;
import java.util.List;
import net.sf.json.JSONString;
public class Account implements JSONString{
private String userName;
private Integer age;
private Date createTime;
private List<Card> cards;
public Account(){};
public Account(String userName, Integer age, Date createTime){
this.userName = userName;
this.age = age;
this.createTime = createTime;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public List<Card> getCards() {
return cards;
}
public void setCards(List<Card> cards) {
this.cards = cards;
}
@Override
public String toJSONString() {
return "{\"userName\":\"" + this.userName + "\",\"age\":" + this.age+",\"createTime\":\"" + this.createTime + "\"}";
}
}
输出结果:
{"userName":"accountName","age":20,"createTime":"Sat Feb 18 13:54:38 CST 2017"}
方法2:属性过滤器jsonconfig排除属性
Account.java
不变,不需要实现JsonString接口。在序列化方法中添加一个jsonConfig参数,即排除需要忽略的属性即可。JSONObject.fromObject(complexBean,jsonConfig);
JsonConfig.setExcludes(String[] excludes)
/**
* @author NowUSeeMe
*/
@Test
public void JsonConfig(){
Card card1 = new Card();
card1.setId(1);
card1.setCardName("中国工商银行");
card1.setCardNum("123456789");
card1.setCardHolder("nowu");
Card card2 = new Card();
card2.setId(2);
card2.setCardName("中国农业银行");
card2.setCardNum("845612345");
card2.setCardHolder("seeme");
List<Card> cards = new ArrayList<Card>();
cards.add(card1);
cards.add(card2);
Account complexBean = new Account();
complexBean.setUserName("accountName");
complexBean.setAge(20);
complexBean.setCards(cards);
complexBean.setCreateTime(new Date());
JsonConfig jsonConfig = new JsonConfig();
String[] excludes ={"cards"};
jsonConfig.setExcludes(excludes);
JSONObject jsonObject = JSONObject.fromObject(complexBean,jsonConfig); //这里JSONObject(推荐) JSONArray都可以
System.out.println(jsonObject);
}
运行结果:
{"age":20,"createTime":{"date":18,"day":6,"hours":14,"minutes":28,"month":1,"seconds":10,"time":1487399290394,"timezoneOffset":-480,"year":117},"userName":"accountName"}
JsonConfig..setJsonPropertyFilter(new PropertyFilter() {})
/**
* @author NowUSeeMe
*/
@Test
public void JsonConfig(){
Card card1 = new Card();
card1.setId(1);
card1.setCardName("中国工商银行");
card1.setCardNum("123456789");
card1.setCardHolder("nowu");
Card card2 = new Card();
card2.setId(2);
card2.setCardName("中国农业银行");
card2.setCardNum("845612345");
card2.setCardHolder("seeme");
List<Card> cards = new ArrayList<Card>();
cards.add(card1);
cards.add(card2);
Account complexBean = new Account();
complexBean.setUserName("accountName");
complexBean.setAge(20);
complexBean.setCards(cards);
complexBean.setCreateTime(new Date());
JsonConfig jsonConfig = new JsonConfig();
//设置属性过滤器,是否应用某字段
jsonConfig.setJsonPropertyFilter(new PropertyFilter() {
/**
* @param Object source 属性的拥有者
* @param String name 属性名字
* @param Object value 属性值
*/
@Override
public boolean apply(Object source, String name, Object value) {
return source instanceof Account、 && "cards".equalsIgnoreCase(name);
}
});
JSONObject jsonObject = JSONObject.fromObject(complexBean,jsonConfig);
System.out.println(jsonObject);
}
注册JsonBeanProcessor
jsonConfig.registerJsonBeanProcessor(Class class, new JsonBeanProcessor() {});
JsonBeanProcessor和实现JsonString很类似,返回一个代表原来目标对象的合法JSONObject
/**
* @author NowUSeeMe
*/
@Test
public void JsonConfig(){
Card card1 = new Card();
card1.setId(1);
card1.setCardName("中国工商银行");
card1.setCardNum("123456789");
card1.setCardHolder("nowu");
Card card2 = new Card();
card2.setId(2);
card2.setCardName("中国农业银行");
card2.setCardNum("845612345");
card2.setCardHolder("seeme");
List<Card> cards = new ArrayList<Card>();
cards.add(card1);
cards.add(card2);
Account complexBean = new Account();
complexBean.setUserName("accountName");
complexBean.setAge(20);
complexBean.setCards(cards);
complexBean.setCreateTime(new Date());
JsonConfig jsonConfig = new JsonConfig();
//注册JsonBeanProcessor
jsonConfig.registerJsonBeanProcessor(Account.class, new JsonBeanProcessor() {
@Override
public JSONObject processBean(Object bean, JsonConfig config) {
Account account = (AccountCopy)bean;
return new JSONObject().element("age", account.getAge()).element("userName", account.getUserName());
}
});
JSONObject jsonObject = JSONObject.fromObject(complexBean,jsonConfig);
System.out.println(jsonObject);
}
运行结果:
{"age":20,"userName":"accountName"}
自定义JsonBeanProcessor
上面的结果包含的日期的格式不是我们想要的,我们希望日期格式是”yyyy-mm-dd HH:mm:ss”这种格式,即可自定义一个JsonBeanProcessor在序列化时处理日期。即:
@Test
public void JsonConfig(){
Card card1 = new Card();
card1.setId(1);
card1.setCardName("中国工商银行");
card1.setCardNum("123456789");
card1.setCardHolder("nowu");
Card card2 = new Card();
card2.setId(2);
card2.setCardName("中国农业银行");
card2.setCardNum("845612345");
card2.setCardHolder("seeme");
List<Card> cards = new ArrayList<Card>();
cards.add(card1);
cards.add(card2);
Account complexBean = new Account();
complexBean.setUserName("accountName");
complexBean.setAge(20);
complexBean.setCards(cards);
complexBean.setCreateTime(new Date());
JsonConfig jsonConfig = new JsonConfig();
//设置排除属性数组
String[] excludes ={"cards"};
jsonConfig.setExcludes(excludes);
jsonConfig.registerJsonValueProcessor(Date.class, new JsonValueProcessor() {
//自定义日期格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//处理对象
@Override
public Object processArrayValue(Object arg0,JsonConfig config) {
return null;
}
//处理数组
@Override
public Object processObjectValue(String propertyName, Object value, JsonConfig config) {
if(propertyName.equals("createTime")){
return simpleDateFormat.format(value);
}
return value;
}
});
JSONObject jsonObject = JSONObject.fromObject(complexBean,jsonConfig);
System.out.println(jsonObject);
}
运行结果:
{"age":20,"createTime":"2017-02-18 15:32:42","userName":"accountName"}
Json转换为Bean
json字符串转换为复杂类型Bean
/**
* 详述:将json解析成复合类型对象, 包含List
*/
@Test
public void Json2ComplexBean(){
String json = " {" +
" 'age':20,'cards':[{'cardHolder':'now','cardName':'中国工商银行','cardNum':'123456789','id':1}," +
" {'cardHolder':'you','cardName':'中国农业银行','cardNum':'845612345','id':2}," +
" {'cardHolder':'see','cardName':'中国银行','cardNum':'123456789','id':3}," +
" {'cardHolder':'me','cardName':'中国建设银行','cardNum':'666666666','id':4}" +
" ]," +
" 'createTime':{'date':20,'day':2,'hours':16,'minutes':5,'month':11,'seconds':18," +
" 'time':1482221118856,'timezoneOffset':-480,'year':116}," +
" 'userName':'accountName'" +
" }";
JSONObject jsonObject = JSONObject.fromObject(json);
// 定义一个Map
Map<String, Class<Card>> classMap = new HashMap<String, Class<Card>>();
classMap.put("cards", Card.class);
Account account = (Account) jsonObject.toBean(jsonObject, Account.class,classMap);
System.out.println("userName:"+account.getUserName());
System.out.println("age:"+account.getAge());
List<Card> cards = account.getCards();
for(Card card:cards){
System.out.println("id:"+card.getId()+" cardName:"+card.getCardName()+" cardHolder:"+card.getCardHolder()+" cardNum:"+card.getCardNum());
}
}
userName:accountName
age:20
id:1 cardName:中国工商银行 cardHolder:now cardNum:123456789
id:2 cardName:中国农业银行 cardHolder:you cardNum:845612345
id:3 cardName:中国银行 cardHolder:see cardNum:123456789
id:4 cardName:中国建设银行 cardHolder:me cardNum:666666666
JsonConfig各种处理器总结
DefaultValueProcessor: 为java类型指定默认值,我们一般不需要实现这个接口,json-lib提供的默认实现基本上可以满足我们的需要。
JsonBeanProcessor:为java对象指定一个解析器。
JsonValueProcessor:为bean的值指定一个解析器,可以将bean中的值输出到json后使用另外的值表示,稍后举例说明
PropertyNameProcessor: 为bean的属性名指定一个解析器,可以将bean中属性名称输出到json后变成另一个名称。
一个JsonConfig对象可以注册多个解析器,既可以为按bean的类型注册解析器,也可以给特定类型的某一个属性指定解析器。
参考
http://blog.csdn.net/jinwufeiyang/article/details/51751904
http://www.sojson.com/blog/20.html