使用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包和代码

/Files/mailingfeng/json-lib/json-lib用例所需jar包和java类.rar 

posted @ 2013-09-04 14:23  那些年的事儿  阅读(417)  评论(0编辑  收藏