您的位置:首页 > 编程语言 > Java开发

Java解析json(一):json-lib

2017-02-03 16:28 507 查看

定义

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 = ne
4000
w 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
ee16
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: