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.jarcommons-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.javapublic 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/51751904http://www.sojson.com/blog/20.html
相关文章推荐
- JAVA中堆和栈的区别
- Struts2——基于StrutsTypeConverter的类型转换
- Java接口 继承 多态
- java 使用 POI替换doc中的文字
- [leetcode]35. Search Insert Position(java)
- Java——方法重载
- java:线程间的协调(二)
- 详解SpringMVC中设置静态资源不被拦截的问题
- java单例模式小demo
- nested exception is java.io.FileNotFoundException: config.xml (系统找不到指定的文件。)
- Java类的实例化的初始化过程
- JavaSE_5th_package和import语句
- Java中基于maven实现zxing二维码功能
- Java开发图片浏览器--记录
- Java将文件分割为多个子文件再将子文件合并成原始文件的示例
- Java设计模型之:原型模式
- 深入研究Servlet线程安全性问题
- JAVA获取某个类加载路径
- java:多线程的使用(一)
- java.lang.OutOfMemoryError: PermGen space解决方法