使用json-lib进行Java和JSON之间的转换(转)
转载:http://www.cnblogs.com/mailingfeng/archive/2012/01/18/2325707.html 稍许改动
1. json-lib是一个java类库,提供将Java对象,包括beans, maps, collections, java arrays and XML等转换成JSON,或者反向转换的功能。
2. json-lib 主页 : http://json-lib.sourceforge.net/
3. 执行环境
需要以下类库支持
- jakarta commons-lang 2.5
- jakarta commons-beanutils 1.8.0
- jakarta commons-collections 3.2.1
- jakarta commons-logging 1.1.1
- ezmorph 1.0.6
4.功能示例
主程序
package com.clzhang.sample.json; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.ezmorph.Morpher; import net.sf.ezmorph.MorpherRegistry; import net.sf.ezmorph.bean.BeanMorpher; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.util.JSONUtils; import org.apache.commons.beanutils.PropertyUtils; import org.junit.Test; /** * JSON-lib包是一个JavaBean、Collection、Map、Array和XML等数据结构与JSON之间互相转换的包。 * 关于JSONArray与JSONObject的差别,请参考前一篇文章。 * @author acer * */ public class JSONLibTest { // 一般数组转换成JSON // @Test public void testArrayToJSON() { boolean[] boolArray = new boolean[]{true, false, true}; JSONArray jsonArray = JSONArray.fromObject(boolArray); System.out.println(jsonArray); } // Collection对象转换成JSON // @Test public void testListToJSON() { List<String> list = new ArrayList<String>(); list.add("first"); list.add("second"); JSONArray jsonArray = JSONArray.fromObject(list); System.out.println(jsonArray); } // 字符串JSON转换成JSON,根据情况是用JSONArray或JSONObject // @Test public void testJSONStrToJSON() { JSONArray jsonArray = JSONArray.fromObject("['json','is','easy']"); System.out.println(jsonArray); } // Map转换成JSON, 是用jsonObject // @Test public void testMapToJSON() { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "json"); 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(jsonObject); } // 复合类型bean转成成JSON // @Test public void testBeadToJSON() { MyBean bean = new MyBean(); bean.setId("001"); bean.setName("银行卡"); bean.setDate(new Date()); List<Object> cardNum = new ArrayList<Object>(); cardNum.add("农行"); cardNum.add("工行"); cardNum.add("建行"); cardNum.add(new Person("test")); bean.setCardNum(cardNum); JSONObject jsonObject = JSONObject.fromObject(bean); System.out.println(jsonObject); } // 普通类型的JSON字符串转换成对象 // @Test public void testJSONToObject() throws Exception { String json = "{name=\"json\",bool:true,int:1,double:2.2,func:function(a){ return a; },array:[1,2]}"; JSONObject jsonObject = JSONObject.fromObject(json); System.out.println(jsonObject); Object bean = JSONObject.toBean(jsonObject); assertEquals(jsonObject.get("name"), PropertyUtils.getProperty(bean, "name")); assertEquals(jsonObject.get("bool"), PropertyUtils.getProperty(bean, "bool")); assertEquals(jsonObject.get("int"), PropertyUtils.getProperty(bean, "int")); assertEquals(jsonObject.get("double"), PropertyUtils.getProperty(bean, "double")); assertEquals(jsonObject.get("func"), PropertyUtils.getProperty(bean, "func")); System.out.println(PropertyUtils.getProperty(bean, "name")); System.out.println(PropertyUtils.getProperty(bean, "bool")); System.out.println(PropertyUtils.getProperty(bean, "int")); System.out.println(PropertyUtils.getProperty(bean, "double")); System.out.println(PropertyUtils.getProperty(bean, "func")); System.out.println(PropertyUtils.getProperty(bean, "array")); @SuppressWarnings("unchecked") List<Object> arrayList = (List<Object>)JSONArray.toCollection(jsonObject.getJSONArray("array")); for (Object object : arrayList) { System.out.println(object); } } // 将JSON解析成复合类型对象, 包含List // @Test public void testJSONToBeanHavaList() { String json = "{list:[{name:'test1'},{name:'test2'}]}"; Map<String, Class<Person>> classMap = new HashMap<String, Class<Person>>(); classMap.put("list", Person.class); MyBeanWithPerson diyBean = (MyBeanWithPerson)JSONObject.toBean(JSONObject.fromObject(json),MyBeanWithPerson.class , classMap); List<Person> list = diyBean.getList(); for(Person p: list){ System.out.println(p.getName()); } } // 将JSON解析成复合类型对象, 包含Map @Test public void testJSONToBeanHavaMap() { // 把Map看成一个对象 String json = "{list:[{name:'test1'},{name:'test2'}],map:{testa:{name:'testa1'},testb:{name:'testb2'}}}"; Map<String, Object> classMap = new HashMap<String, Object>(); classMap.put("list", Person.class); classMap.put("map", Map.class); // 直接将JSON解析为指定自定义对象,其中List完全解析,Map没有完全解析 MyBeanWithPerson diyBean = (MyBeanWithPerson)JSONObject.toBean( JSONObject.fromObject(json), MyBeanWithPerson.class, classMap); // 1.List完全解析,可以直接输出 List<Person> list = diyBean.getList(); for (Person p: list) { System.out.println(p.getName()); } System.out.println("-------------------"); // 2.Map没有完全解析,下面的结果不是想要的结果 Map<String, Person> map = diyBean.getMap(); for(Map.Entry<String, Person> entry: map.entrySet()) { System.out.println(entry.getKey()); System.out.println(entry.getValue()); } System.out.println("-------------------"); // Map经过下面的处理后,输出为想要的结果 //2.1 先往注册器中注册变换器,需要用到ezmorph包中的类 MorpherRegistry morpherRegistry = JSONUtils.getMorpherRegistry(); Morpher dynaMorpher = new BeanMorpher(Person.class, morpherRegistry); morpherRegistry.registerMorpher(dynaMorpher); // 这里的map没进行类型暗示,故按默认的,里面存的为net.sf.ezmorph.bean.MorphDynaBean类型的对象 Map<String, Person> transMap = new HashMap<String, Person>(); for(Map.Entry<String, Person> entry: map.entrySet()) { //2.2 使用注册器对指定Bean进行对象变换 transMap.put(entry.getKey(), (Person) morpherRegistry.morph(Person.class, entry.getValue())); } //2.3 最终输出正确的结果 for(Map.Entry<String, Person> entry: transMap.entrySet()) { Person p = entry.getValue(); System.out.println(entry.getKey() + "->" + p.getName()); } System.out.println("-------------------"); } }
方法testJSONToBeanHavaMap()输出如下:
test1
test2
-------------------
testb
net.sf.ezmorph.bean.MorphDynaBean@780525d3[
{name=testb2}
]
testa
net.sf.ezmorph.bean.MorphDynaBean@19f67d34[
{name=testa1}
]
-------------------
testb->testb2
testa->testa1
-------------------
5.下面提供上面例子所需的资源,包括jar包和代码