JSON-lib框架,转换JSON、XML不再困难

黄舟
发布: 2017-02-18 15:10:46
原创
2425人浏览过

json-lib可以将java对象转成json格式的字符串,也可以将java对象转换成xml格式的文档,同样可以将json字符串转换成java对象或是将xml字符串转换成java对象。

一、 准备工作 

 

1、 首先要去官方下载json-lib工具包

下载地址:

http://www.php.cn/

目前最新的是2.4的版本,本示例中使用的是v2.3;json-lib还需要以下依赖包:

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

官方网址:http://www.php.cn/

然后在工程中添加如下jar包:

clip_image002

当然你也可以用2.4的json-lib库

你可以在这里看看官方提供的示例:

http://www.php.cn/

由于本次介绍的示例需要junit工具,所以你还需要添加junit的jar文件,版本是4.8.2版本的,下载地址:http://www.php.cn/

如果你还不了解JSON是什么?那么你应该可以看看http://www.php.cn/

2、 要转换的JavaBean的代码如下:

package com.hoo.entity;
登录后复制
 <br/>
登录后复制
public class Student {
登录后复制
    private int id;
登录后复制
    private String name;
登录后复制
    private String email;
登录后复制
    private String address;
登录后复制
    private Birthday birthday;
登录后复制
 <br/>
登录后复制
    //setter、getter
登录后复制
    public String toString() {
登录后复制
        return this.name + "#" + this.id + "#" + this.address + "#" + this.birthday + "#" + this.email;
登录后复制
    }
登录后复制
}
登录后复制
 <br/>
登录后复制

Birthday.java

package com.hoo.entity;
登录后复制
 <br/>
登录后复制
public class Birthday {
登录后复制
    private String birthday;
登录后复制
    <br/>
登录后复制
    public Birthday(String birthday) {
登录后复制
        super();
登录后复制
        this.birthday = birthday;
登录后复制
    }
登录后复制
    //setter、getter
登录后复制
    public Birthday() {}
登录后复制
    <br/>
登录后复制
    @Override
登录后复制
    public String toString() {
登录后复制
        return this.birthday;
登录后复制
    }
登录后复制
}
登录后复制

注意,上面的getter、setter方法省略了,自己构建下。

3、 新建JsonlibTest测试类,基本代码如下:

package com.hoo.test;
登录后复制
 <br/>
登录后复制
import java.lang.reflect.InvocationTargetException;
登录后复制
import java.util.ArrayList;
登录后复制
import java.util.Collection;
登录后复制
import java.util.Date;
登录后复制
import java.util.HashMap;
登录后复制
import java.util.Iterator;
登录后复制
import java.util.List;
登录后复制
import java.util.Map;
登录后复制
import java.util.Set;
登录后复制
import net.sf.json.JSON;
登录后复制
import net.sf.json.JSONArray;
登录后复制
import net.sf.json.JSONFunction;
登录后复制
import net.sf.json.JSONObject;
登录后复制
import net.sf.json.JSONSerializer;
登录后复制
import net.sf.json.JsonConfig;
登录后复制
import net.sf.json.processors.JsonValueProcessor;
登录后复制
import net.sf.json.util.PropertyFilter;
登录后复制
import net.sf.json.xml.XMLSerializer;
登录后复制
import org.apache.commons.beanutils.PropertyUtils;
登录后复制
import org.junit.After;
登录后复制
import org.junit.Before;
登录后复制
import org.junit.Test;
登录后复制
import com.hoo.entity.Birthday;
登录后复制
import com.hoo.entity.Student;
登录后复制
 <br/>
登录后复制
/**
登录后复制
 * <b>function:</b> 用json-lib转换java对象到JSON字符串
登录后复制
 * 读取json字符串到java对象,序列化jsonObject到xml
登录后复制
 * json-lib-version: json-lib-2.3-jdk15.jar
登录后复制
 * 依赖包:
登录后复制
 * commons-beanutils.jar
登录后复制
 * commons-collections-3.2.jar
登录后复制
 * ezmorph-1.0.3.jar
登录后复制
 * commons-lang.jar
登录后复制
 * commons-logging.jar
登录后复制
 * @author hoojo
登录后复制
 * @createDate Nov 28, 2010 2:28:39 PM
登录后复制
 * @file JsonlibTest.java
登录后复制
 * @package com.hoo.test
登录后复制
 * @project WebHttpUtils
登录后复制
 * @blog http://www.php.cn/
登录后复制
 * @email hoojo_@126.com
登录后复制
 * @version 1.0
登录后复制
 */
登录后复制
@SuppressWarnings({ "deprecation", "unchecked" })
登录后复制
public class JsonlibTest {
登录后复制
    private JSONArray jsonArray = null;
登录后复制
    private JSONObject jsonObject = null;
登录后复制
    <br/>
登录后复制
    private Student bean = null;
登录后复制
    <br/>
登录后复制
    @Before
登录后复制
    public void init() {
登录后复制
        jsonArray = new JSONArray();
登录后复制
        jsonObject = new JSONObject();
登录后复制
        <br/>
登录后复制
        bean = new Student();
登录后复制
        bean.setAddress("address");
登录后复制
        bean.setEmail("email");
登录后复制
        bean.setId(1);
登录后复制
        bean.setName("haha");
登录后复制
        Birthday day = new Birthday();
登录后复制
        day.setBirthday("2010-11-22");
登录后复制
        bean.setBirthday(day);
登录后复制
    }
登录后复制
    <br/>
登录后复制
    @After
登录后复制
    public void destory() {
登录后复制
        jsonArray = null;
登录后复制
        jsonObject = null;
登录后复制
        bean = null;
登录后复制
        System.gc();
登录后复制
    }
登录后复制
    <br/>
登录后复制
    public final void fail(String string) {
登录后复制
        System.out.println(string);
登录后复制
    }
登录后复制
    <br/>
登录后复制
    public final void failRed(String string) {
登录后复制
        System.err.println(string);
登录后复制
    }
登录后复制
    <br/>
登录后复制
}
登录后复制

上面的init会在每个方法之前运行,destory会在每个方法完成后执行。分别用到了junit的@Before、@After注解,如果你对junit的这些注解不是很了解,可以看看junit官方的测试用例的example和doc;

JSONObject是将Java对象转换成一个json的Object形式,JSONArray是将一个Java对象转换成json的Array格式。

那什么是json的Object形式、Array形式?

用通俗易懂的方法将,所谓的json的Object形式就是一个花括号里面存放的如JavaMap的键值对,如:{name:’hoojo’, age: 24};

那么json的Array形式呢?

就是中括号,括起来的数组。如:[ ‘json’, true, 22];

如果你还想了解更多json方面的知识,请看:http://www.php.cn/

除了上面的JSONArray、JSONObject可以将Java对象转换成JSON或是相反,将JSON字符串转换成Java对象,还有一个对象也可以完成上面的功能,它就是JSONSerializer;下面我们就来看看它们是怎么玩转Java对象和JSON的。

二、 Java对象序列化成JSON对象

1、 将JavaObject转换吃JSON字符串

在JsonlibTest中添加如下代码:

/*=========================Java Object >>>> JSON String ===========================*/
登录后复制
/**
登录后复制
 * <b>function:</b>转Java Bean对象到JSON
登录后复制
 * @author hoojo
登录后复制
 * @createDate Nov 28, 2010 2:35:54 PM
登录后复制
 */
登录后复制
@Test
登录后复制
public void writeEntity2JSON() {
登录后复制
    fail("==============Java Bean >>> JSON Object==================");
登录后复制
    fail(JSONObject.fromObject(bean).toString());
登录后复制
    fail("==============Java Bean >>> JSON Array==================");
登录后复制
    fail(JSONArray.fromObject(bean).toString());//array会在最外层套上[]
登录后复制
    fail("==============Java Bean >>> JSON Object ==================");
登录后复制
    fail(JSONSerializer.toJSON(bean).toString());
登录后复制
    <br/>
登录后复制
    fail("========================JsonConfig========================");
登录后复制
    JsonConfig jsonConfig = new JsonConfig();
登录后复制
    jsonConfig.registerJsonValueProcessor(Birthday.class, new JsonValueProcessor() {
登录后复制
        public Object processArrayValue(Object value, JsonConfig jsonConfig) {
登录后复制
            if (value == null) {
登录后复制
                return new Date();
登录后复制
            }
登录后复制
            return value;
登录后复制
        }
登录后复制
 <br/>
登录后复制
        public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
登录后复制
            fail("key:" + key);
登录后复制
            return value + "##修改过的日期";
登录后复制
        }
登录后复制
 <br/>
登录后复制
    });
登录后复制
    jsonObject = JSONObject.fromObject(bean, jsonConfig);
登录后复制
    <br/>
登录后复制
    fail(jsonObject.toString());
登录后复制
    Student student = (Student) JSONObject.toBean(jsonObject, Student.class);
登录后复制
    fail(jsonObject.getString("birthday"));
登录后复制
    fail(student.toString());
登录后复制
    <br/>
登录后复制
    fail("#####################JsonPropertyFilter############################");
登录后复制
    jsonConfig.setJsonPropertyFilter(new PropertyFilter() {
登录后复制
        public boolean apply(Object source, String name, Object value) {
登录后复制
            fail(source + "%%%" + name + "--" + value);
登录后复制
            //忽略birthday属性
登录后复制
            if (value != null && Birthday.class.isAssignableFrom(value.getClass())) {
登录后复制
                return true;
登录后复制
            }
登录后复制
            return false;
登录后复制
        }
登录后复制
    });
登录后复制
    fail(JSONObject.fromObject(bean, jsonConfig).toString());
登录后复制
    fail("#################JavaPropertyFilter##################");
登录后复制
    jsonConfig.setRootClass(Student.class);
登录后复制
    jsonConfig.setJavaPropertyFilter(new PropertyFilter() {
登录后复制
        public boolean apply(Object source, String name, Object value) {
登录后复制
            fail(name + "@" + value + "#" + source);
登录后复制
            if ("id".equals(name) || "email".equals(name)) {
登录后复制
                value = name + "@@";
登录后复制
                return true;
登录后复制
            }
登录后复制
            return false;
登录后复制
        }
登录后复制
    });
登录后复制
    //jsonObject = JSONObject.fromObject(bean, jsonConfig);
登录后复制
    //student = (Student) JSONObject.toBean(jsonObject, Student.class);
登录后复制
    //fail(student.toString());
登录后复制
    student = (Student) JSONObject.toBean(jsonObject, jsonConfig);
登录后复制
    fail("Student:" + student.toString());
登录后复制
}
登录后复制

fromObject将Java对象转换成json字符串,toBean将json对象转换成Java对象;

上面方法值得注意的是使用了JsonConfig这个对象,这个对象可以在序列化的时候对JavaObject的数据进行处理、过滤等

上面的jsonConfig的registerJsonValueProcessor方法可以完成对象值的处理和修改,比如处理生日为null时,给一个特定的值。同样setJsonPropertyFilter和setJavaPropertyFilter都是完成对转换后的值的处理。

运行上面的代码可以在控制台看到如下结果:

==============Java Bean >>> JSON Object==================
登录后复制
{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"haha"}
登录后复制
==============Java Bean >>> JSON Array==================
登录后复制
[{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"haha"}]
登录后复制
==============Java Bean >>> JSON Object ==================
登录后复制
{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"haha"}
登录后复制
========================JsonConfig========================
登录后复制
key:birthday
登录后复制
{"address":"address","birthday":"2010-11-22##修改过的日期","email":"email","id":1,"name":"haha"}
登录后复制
2010-11-22##修改过的日期
登录后复制
haha#1#address#null#email
登录后复制
#####################JsonPropertyFilter############################
登录后复制
haha#1#address#2010-11-22#email%%%address--address
登录后复制
haha#1#address#2010-11-22#email%%%birthday--2010-11-22
登录后复制
haha#1#address#2010-11-22#email%%%email--email
登录后复制
haha#1#address#2010-11-22#email%%%id--1
登录后复制
haha#1#address#2010-11-22#email%%%name--haha
登录后复制
{"address":"address","email":"email","id":1,"name":"haha"}
登录后复制
#################JavaPropertyFilter##################
登录后复制
address@address#null#0#null#null#null
登录后复制
birthday@2010-11-22##修改过的日期#null#0#address#null#null
登录后复制
email@email#null#0#address#null#null
登录后复制
id@1#null#0#address#null#null
登录后复制
name@haha#null#0#address#null#null
登录后复制
Student:haha#0#address#null#null
登录后复制

2、 将JavaList集合转换吃JSON字符串

/**
登录后复制
 * <b>function:</b>转换Java List集合到JSON
登录后复制
 * @author hoojo
登录后复制
 * @createDate Nov 28, 2010 2:36:15 PM
登录后复制
 */
登录后复制
@Test
登录后复制
public void writeList2JSON() {
登录后复制
    fail("==============Java List >>> JSON Array==================");
登录后复制
    List<Student> stu = new ArrayList<Student>();
登录后复制
    stu.add(bean);
登录后复制
    bean.setName("jack");
登录后复制
    stu.add(bean);
登录后复制
    fail(JSONArray.fromObject(stu).toString());
登录后复制
    fail(JSONSerializer.toJSON(stu).toString());
登录后复制
}
登录后复制

运行此方法后,可以看到控制台输出:

==============Java List >>> JSON Array==================
登录后复制
[{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"},
登录后复制
{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"}]
登录后复制
[{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"},
登录后复制
{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"}]
登录后复制

如果你是转换List集合,一定得用JSONArray或是JSONSrializer提供的序列化方法。如果你用JSONObject.fromObject方法转换List会出现异常,通常使用JSONSrializer这个JSON序列化的方法,它会自动识别你传递的对象的类型,然后转换成相应的JSON字符串。

3、 将Map集合转换成JSON对象

/**
登录后复制
 * <b>function:</b>转Java Map对象到JSON
登录后复制
 * @author hoojo
登录后复制
 * @createDate Nov 28, 2010 2:37:35 PM
登录后复制
 */
登录后复制
@Test
登录后复制
public void writeMap2JSON() {
登录后复制
    Map<String, Object> map = new HashMap<String, Object>();
登录后复制
    map.put("A", bean);
登录后复制
    <br/>
登录后复制
    bean.setName("jack");
登录后复制
    map.put("B", bean);
登录后复制
    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]; }");
登录后复制
    fail("==============Java Map >>> JSON Object==================");
登录后复制
    fail(JSONObject.fromObject(map).toString());
登录后复制
    fail("==============Java Map >>> JSON Array ==================");
登录后复制
    fail(JSONArray.fromObject(map).toString());
登录后复制
    fail("==============Java Map >>> JSON Object==================");
登录后复制
    fail(JSONSerializer.toJSON(map).toString());
登录后复制
}
登录后复制

上面的Map集合有JavaBean、String、Boolean、Integer、以及Array和js的function函数的字符串。

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online30
查看详情 Find JSON Path Online

运行上面的程序,结果如下:

==============Java Map >>> JSON Object==================
登录后复制
{"arr":["a","b"],"A":{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"},"int":1,
登录后复制
"B":{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"},"name":"json",
登录后复制
"func":function(i){ return this.arr[i]; },"bool":true}
登录后复制
==============Java Map >>> JSON Array ==================
登录后复制
[{"arr":["a","b"],"A":{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"},"int":1,
登录后复制
"B":{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"},"name":"json",
登录后复制
"func":function(i){ return this.arr[i]; },"bool":true}]
登录后复制
==============Java Map >>> JSON Object==================
登录后复制
{"arr":["a","b"],"A":{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"},"int":1,
登录后复制
"B":{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"},"name":"json",
登录后复制
"func":function(i){ return this.arr[i]; },"bool":true}
登录后复制

4、 将更多类型转换成JSON

/**
登录后复制
 * <b>function:</b>  转换更多数组类型到JSON
登录后复制
 * @author hoojo
登录后复制
 * @createDate Nov 28, 2010 2:39:19 PM
登录后复制
 */
登录后复制
@Test
登录后复制
public void writeObject2JSON() {
登录后复制
    String[] sa = {"a", "b", "c"};
登录后复制
    fail("==============Java StringArray >>> JSON Array ==================");
登录后复制
    fail(JSONArray.fromObject(sa).toString());
登录后复制
    fail(JSONSerializer.toJSON(sa).toString());
登录后复制
    fail("==============Java boolean Array >>> JSON Array ==================");
登录后复制
    boolean[] bo = { true, false, true };
登录后复制
    fail(JSONArray.fromObject(bo).toString());
登录后复制
    fail(JSONSerializer.toJSON(bo).toString());
登录后复制
    Object[] o = { 1, "a", true, 'A', sa, bo };
登录后复制
    fail("==============Java Object Array >>> JSON Array ==================");
登录后复制
    fail(JSONArray.fromObject(o).toString());
登录后复制
    fail(JSONSerializer.toJSON(o).toString());
登录后复制
    fail("==============Java String >>> JSON ==================");
登录后复制
    fail(JSONArray.fromObject("['json','is','easy']").toString());
登录后复制
    fail(JSONObject.fromObject("{'json':'is easy'}").toString());
登录后复制
    fail(JSONSerializer.toJSON("['json','is','easy']").toString());
登录后复制
    fail("==============Java JSONObject >>> JSON ==================");
登录后复制
    jsonObject = new JSONObject()
登录后复制
        .element("string", "JSON")
登录后复制
        .element("integer", "1")
登录后复制
        .element("double", "2.0")
登录后复制
        .element("boolean", "true");
登录后复制
    fail(JSONSerializer.toJSON(jsonObject).toString());
登录后复制
    <br/>
登录后复制
    fail("==============Java JSONArray >>> JSON ==================");
登录后复制
    jsonArray = new JSONArray()
登录后复制
        .element( "JSON" )
登录后复制
        .element( "1" )
登录后复制
        .element( "2.0" )
登录后复制
        .element( "true" );
登录后复制
    fail(JSONSerializer.toJSON(jsonArray).toString());
登录后复制
    <br/>
登录后复制
    fail("==============Java JSONArray JsonConfig#setArrayMode >>> JSON ==================");
登录后复制
    List input = new ArrayList();
登录后复制
    input.add("JSON");
登录后复制
    input.add("1");
登录后复制
    input.add("2.0");
登录后复制
    input.add("true");
登录后复制
    JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON( input );
登录后复制
    JsonConfig jsonConfig = new JsonConfig();
登录后复制
    jsonConfig.setArrayMode( JsonConfig.MODE_OBJECT_ARRAY );
登录后复制
    Object[] output = (Object[]) JSONSerializer.toJava(jsonArray, jsonConfig);
登录后复制
    System.out.println(output[0]);
登录后复制
    <br/>
登录后复制
    fail("==============Java JSONFunction >>> JSON ==================");
登录后复制
    String str = "{'func': function( param ){ doSomethingWithParam(param); }}";
登录后复制
    JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON(str);
登录后复制
    JSONFunction func = (JSONFunction) jsonObject.get("func");
登录后复制
    fail(func.getParams()[0]);
登录后复制
    fail(func.getText() );
登录后复制
}
登录后复制

运行后结果如下:

==============Java StringArray >>> JSON Array ==================
登录后复制
["a","b","c"]
登录后复制
["a","b","c"]
登录后复制
==============Java boolean Array >>> JSON Array ==================
登录后复制
[true,false,true]
登录后复制
[true,false,true]
登录后复制
==============Java Object Array >>> JSON Array ==================
登录后复制
[1,"a",true,"A",["a","b","c"],[true,false,true]]
登录后复制
[1,"a",true,"A",["a","b","c"],[true,false,true]]
登录后复制
==============Java String >>> JSON ==================
登录后复制
["json","is","easy"]
登录后复制
{"json":"is easy"}
登录后复制
["json","is","easy"]
登录后复制
==============Java JSONObject >>> JSON ==================
登录后复制
{"string":"JSON","integer":"1","double":"2.0","boolean":"true"}
登录后复制
==============Java JSONArray >>> JSON ==================
登录后复制
["JSON","1","2.0","true"]
登录后复制
==============Java JSONArray JsonConfig#setArrayMode >>> JSON ==================
登录后复制
JSON
登录后复制
==============Java JSONFunction >>> JSON ==================
登录后复制
param
登录后复制
doSomethingWithParam(param);
登录后复制

这里还有一个JSONFunction的对象,可以转换JavaScript的function。可以获取方法参数和方法体。同时,还可以用JSONObject、JSONArray构建Java对象,完成Java对象到JSON字符串的转换。

三、 JSON对象反序列化成Java对象

1、 将json字符串转成Java对象

private String json = "{\"address\":\"chian\",\"birthday\":{\"birthday\":\"2010-11-22\"}," +
登录后复制
        "\"email\":\"email@123.com\",\"id\":22,\"name\":\"tom\"}";
登录后复制
/**
登录后复制
 * <b>function:</b>将json字符串转化为java对象
登录后复制
 * @author hoojo
登录后复制
 * @createDate Nov 28, 2010 3:01:16 PM
登录后复制
 */
登录后复制
@Test
登录后复制
public void readJSON2Bean() {
登录后复制
    fail("==============JSON Object String >>> Java Bean ==================");
登录后复制
    jsonObject = JSONObject.fromObject(json);
登录后复制
    Student stu = (Student) JSONObject.toBean(jsonObject, Student.class);
登录后复制
    fail(stu.toString());
登录后复制
}
登录后复制

运行后,结果如下:

==============JSON Object String >>> Java Bean ==================
登录后复制
tom#22#chian#2010-11-22#email@123.com
登录后复制

2、 将json字符串转换成动态Java对象(MorphDynaBean)

private String json = "{\"address\":\"chian\",\"birthday\":{\"birthday\":\"2010-11-22\"},"+
登录后复制
        "\"email\":\"email@123.com\",\"id\":22,\"name\":\"tom\"}";
登录后复制
 <br/>
登录后复制
@Test
登录后复制
public void readJSON2DynaBean() {
登录后复制
    try {
登录后复制
        fail("==============JSON Object String >>> Java MorphDynaBean ==================");
登录后复制
        JSON jo = JSONSerializer.toJSON(json);
登录后复制
        Object o = JSONSerializer.toJava(jo);//MorphDynaBean
登录后复制
        fail(PropertyUtils.getProperty(o, "address").toString());
登录后复制
        jsonObject = JSONObject.fromObject(json);
登录后复制
        fail(jsonObject.getString("email"));
登录后复制
        o = JSONSerializer.toJava(jsonObject);//MorphDynaBean
登录后复制
        fail(PropertyUtils.getProperty(o, "name").toString());
登录后复制
    } catch (IllegalAccessException e) {
登录后复制
        e.printStackTrace();
登录后复制
    } catch (InvocationTargetException e) {
登录后复制
        e.printStackTrace();
登录后复制
    } catch (NoSuchMethodException e) {
登录后复制
        e.printStackTrace();
登录后复制
    }
登录后复制
}
登录后复制

转换后的对象Object是一个MorphDynaBean的动态JavaBean,通过PropertyUtils可以获得指定的属性的值。

运行后结果如下:

==============JSON Object String >>> Java MorphDynaBean =============
登录后复制
chian
登录后复制
email@123.com
登录后复制
tom
登录后复制

3、 将json字符串转成Java的Array数组

private String json = "{\"address\":\"chian\",\"birthday\":{\"birthday\":\"2010-11-22\"},"+
登录后复制
        "\"email\":\"email@123.com\",\"id\":22,\"name\":\"tom\"}";
登录后复制
 <br/>
登录后复制
@Test
登录后复制
public void readJSON2Array() {
登录后复制
    try {
登录后复制
        fail("==============JSON Arry String >>> Java Array ==================");
登录后复制
        json = "[" + json + "]";
登录后复制
        jsonArray = JSONArray.fromObject(json);
登录后复制
        fail("#%%%" + jsonArray.get(0).toString());
登录后复制
        Object[] os = jsonArray.toArray();
登录后复制
        System.out.println(os.length);
登录后复制
        <br/>
登录后复制
        fail(JSONArray.fromObject(json).join(""));
登录后复制
        fail(os[0].toString());
登录后复制
        Student[] stus = (Student[]) JSONArray.toArray(jsonArray, Student.class);
登录后复制
        System.out.println(stus.length);
登录后复制
        System.out.println(stus[0]);
登录后复制
    } catch (Exception e) {
登录后复制
        e.printStackTrace();
登录后复制
    }
登录后复制
}
登录后复制

运行的结果如下:

==============JSON Arry String >>> Java Array ==================
登录后复制
#%%%{"address":"chian","birthday":{"birthday":"2010-11-22"},"email":"email@123.com","id":22,"name":"tom"}
登录后复制
1
登录后复制
{"address":"chian","birthday":{"birthday":"2010-11-22"},"email":"email@123.com","id":22,"name":"tom"}
登录后复制
{"address":"chian","birthday":{"birthday":"2010-11-22"},"email":"email@123.com","id":22,"name":"tom"}
登录后复制
1
登录后复制
tom#22#chian#2010-11-22#email@123.com
登录后复制

4、 将JSON字符串转成Java的List集合

private String json = "{\"address\":\"chian\",\"birthday\":{\"birthday\":\"2010-11-22\"},"+
登录后复制
        "\"email\":\"email@123.com\",\"id\":22,\"name\":\"tom\"}";
登录后复制
 <br/>
登录后复制
@Test
登录后复制
public void readJSON2List() {
登录后复制
    try {
登录后复制
        fail("==============JSON Arry String >>> Java List ==================");
登录后复制
        json = "[" + json + "]";
登录后复制
        jsonArray = JSONArray.fromObject(json);
登录后复制
        List<Student> list = JSONArray.toList(jsonArray, Student.class);
登录后复制
        System.out.println(list.size());
登录后复制
        System.out.println(list.get(0));
登录后复制
        <br/>
登录后复制
        list = JSONArray.toList(jsonArray);
登录后复制
        System.out.println(list.size());
登录后复制
        System.out.println(list.get(0));//MorphDynaBean
登录后复制
    } catch (Exception e) {
登录后复制
        e.printStackTrace();
登录后复制
    }
登录后复制
}
登录后复制

运行后结果如下:

==============JSON Arry String >>> Java List ==================
登录后复制
1
登录后复制
tom#22#chian#2010-11-22#email@123.com
登录后复制
1
登录后复制
net.sf.ezmorph.bean.MorphDynaBean@141b571[
登录后复制
  {id=22, birthday=net.sf.ezmorph.bean.MorphDynaBean@b23210[
登录后复制
  {birthday=2010-11-22}
登录后复制
], address=chian, email=email@123.com, name=tom}
登录后复制
]
登录后复制

5、 将json字符串转换成Collection接口

private String json = "{\"address\":\"chian\",\"birthday\":{\"birthday\":\"2010-11-22\"},"+
登录后复制
        "\"email\":\"email@123.com\",\"id\":22,\"name\":\"tom\"}";
登录后复制
 <br/>
登录后复制
@Test
登录后复制
public void readJSON2Collection() {
登录后复制
    try {
登录后复制
        fail("==============JSON Arry String >>> Java Collection ==================");
登录后复制
        json = "[" + json + "]";
登录后复制
        jsonArray = JSONArray.fromObject(json);
登录后复制
        Collection<Student> con = JSONArray.toCollection(jsonArray, Student.class);
登录后复制
        System.out.println(con.size());
登录后复制
        Object[] stt = con.toArray();
登录后复制
        System.out.println(stt.length);
登录后复制
        fail(stt[0].toString());
登录后复制
        <br/>
登录后复制
    } catch (Exception e) {
登录后复制
        e.printStackTrace();
登录后复制
    }
登录后复制
}
登录后复制

刚才上面的将json转换成list提示该方法过时,这里有toCollection,可以用此方法代替toList方法;运行后结果如下:

==============JSON Arry String >>> Java Collection ==================
登录后复制
1
登录后复制
1
登录后复制
tom#22#chian#2010-11-22#email@123.com
登录后复制

6、 将json字符串转换成Map集合

@Test
登录后复制
public void readJSON2Map() {
登录后复制
    try {
登录后复制
        fail("==============JSON Arry String >>> Java Map ==================");
登录后复制
        json = "{\"arr\":[\"a\",\"b\"],\"A\":{\"address\":\"address\",\"birthday\":{\"birthday\":\"2010-11-22\"},"+
登录后复制
        "\"email\":\"email\",\"id\":1,\"name\":\"jack\"},\"int\":1,"+
登录后复制
        "\"B\":{\"address\":\"address\",\"birthday\":{\"birthday\":\"2010-11-22\"},"+
登录后复制
        "\"email\":\"email\",\"id\":1,\"name\":\"jack\"},\"name\":\"json\",\"bool\":true}";
登录后复制
        jsonObject = JSONObject.fromObject(json);
登录后复制
        Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();
登录后复制
        clazzMap.put("arr", String[].class);
登录后复制
        clazzMap.put("A", Student.class);
登录后复制
        clazzMap.put("B", Student.class);
登录后复制
        Map<String, ?> mapBean = (Map) JSONObject.toBean(jsonObject, Map.class, clazzMap);
登录后复制
        System.out.println(mapBean);
登录后复制
        <br/>
登录后复制
        Set<String> set = mapBean.keySet();
登录后复制
        Iterator<String> iter = set.iterator();
登录后复制
        while (iter.hasNext()) {
登录后复制
            String key = iter.next();
登录后复制
            fail(key + ":" + mapBean.get(key).toString());
登录后复制
        }
登录后复制
    } catch (Exception e) {
登录后复制
        e.printStackTrace();
登录后复制
    }
登录后复制
}
登录后复制

运行后结果如下:

==============JSON Arry String >>> Java Map ==================
登录后复制
{A=jack#1#address#2010-11-22#email, arr=[a, b], B=jack#1#address#2010-11-22#email, int=1, name=json, bool=true}
登录后复制
A:jack#1#address#2010-11-22#email
登录后复制
arr:[a, b]
登录后复制
B:jack#1#address#2010-11-22#email
登录后复制
int:1
登录后复制
name:json
登录后复制
bool:true
登录后复制

四、 JSON-libXML的支持

1、 将Java对象到XML

/*============================Java Object >>>>> XML ==========================*/
登录后复制
/**
登录后复制
 * <b>function:</b> 转换Java对象到XML
登录后复制
 * 需要额外的jar包:xom.jar
登录后复制
 * @author hoojo
登录后复制
 * @createDate Nov 28, 2010 2:39:55 PM
登录后复制
 */
登录后复制
@Test
登录后复制
public void writeObject2XML() {
登录后复制
    XMLSerializer xmlSerializer = new XMLSerializer();
登录后复制
    fail("==============Java String Array >>> XML ==================");
登录后复制
    //xmlSerializer.setElementName("bean");
登录后复制
    fail(xmlSerializer.write(JSONArray.fromObject(bean)));
登录后复制
    String[] sa = {"a", "b", "c"};
登录后复制
    fail("==============Java String Array >>> XML ==================");
登录后复制
    fail(xmlSerializer.write(JSONArray.fromObject(sa)));
登录后复制
    fail("==============Java boolean Array >>> XML ==================");
登录后复制
    boolean[] bo = { true, false, true };
登录后复制
    fail(xmlSerializer.write(JSONArray.fromObject(bo)));
登录后复制
    fail(xmlSerializer.write(JSONSerializer.toJSON(bo)));
登录后复制
    Object[] o = { 1, "a", true, 'A', sa, bo };
登录后复制
    fail("==============Java Object Array >>> JSON Array ==================");
登录后复制
    fail(xmlSerializer.write(JSONArray.fromObject(o)));
登录后复制
    fail(xmlSerializer.write(JSONSerializer.toJSON(o)));
登录后复制
    fail("==============Java String >>> JSON ==================");
登录后复制
    fail(xmlSerializer.write(JSONArray.fromObject("['json','is','easy']")).toString());
登录后复制
    fail(xmlSerializer.write(JSONObject.fromObject("{'json':'is easy'}")).toString());
登录后复制
    fail(xmlSerializer.write(JSONSerializer.toJSON("['json','is','easy']")).toString());
登录后复制
}
登录后复制

主要运用的是XMLSerializer的write方法,这个方法可以完成java对象到xml的转换,不过你很容易就可以看到这个xml序列化对象,需要先将java对象转成json对象,然后再将json转换吃xml文档。

运行后结果如下:

==============Java String Array >>> XML ==================
<?xml version="1.0" encoding="UTF-8"?>
<a><e class="object">
<address type="string">address</address><birthday class="object"><birthday type="string">2010-11-22</birthday></birthday>
<email type="string">email</email><id type="number">1</id><name type="string">haha</name>
</e></a>
 
==============Java String Array >>> XML ==================
<?xml version="1.0" encoding="UTF-8"?>
<a><e type="string">a</e><e type="string">b</e><e type="string">c</e></a>
 
==============Java boolean Array >>> XML ==================
<?xml version="1.0" encoding="UTF-8"?>
<a><e type="boolean">true</e><e type="boolean">false</e><e type="boolean">true</e></a>
 
<?xml version="1.0" encoding="UTF-8"?>
<a><e type="boolean">true</e><e type="boolean">false</e><e type="boolean">true</e></a>
 
==============Java Object Array >>> JSON Array ==================
<?xml version="1.0" encoding="UTF-8"?>
<a><e type="number">1</e><e type="string">a</e><e type="boolean">true</e><e type="string">A</e><e class="array">
<e type="string">a</e><e type="string">b</e><e type="string">c</e></e><e class="array"><e type="boolean">true</e>
<e type="boolean">false</e><e type="boolean">true</e></e></a>
 
<?xml version="1.0" encoding="UTF-8"?>
<a><e type="number">1</e><e type="string">a</e><e type="boolean">true</e><e type="string">A</e><e class="array">
<e type="string">a</e><e type="string">b</e><e type="string">c</e></e><e class="array"><e type="boolean">true</e>
<e type="boolean">false</e><e type="boolean">true</e></e></a>
 
==============Java String >>> JSON ==================
<?xml version="1.0" encoding="UTF-8"?>
<a><e type="string">json</e><e type="string">is</e><e type="string">easy</e></a>
 
<?xml version="1.0" encoding="UTF-8"?>
<o><json type="string">is easy</json></o>
 
<?xml version="1.0" encoding="UTF-8"?>
<a><e type="string">json</e><e type="string">is</e><e type="string">easy</e></a>
登录后复制

上面的节点名称有点乱,你可以通过setElementName设置节点名称

2、 将XML转换成Java对象

/*============================XML String >>>>> Java Object ==========================*/
登录后复制
/**
登录后复制
 * <b>function:</b>转换xml文档到java对象
登录后复制
 * @author hoojo
登录后复制
 * @createDate Nov 28, 2010 3:00:27 PM
登录后复制
 */
登录后复制
@Test
登录后复制
public void readXML2Object() {
登录后复制
    XMLSerializer xmlSerializer = new XMLSerializer();
登录后复制
    fail("============== XML >>>> Java String Array ==================");
登录后复制
    String[] sa = {"a", "b", "c"};
登录后复制
    jsonArray = (JSONArray) xmlSerializer.read(xmlSerializer.write(JSONArray.fromObject(sa)));
登录后复制
    fail(jsonArray.toString());
登录后复制
    <br/>
登录后复制
    String[] s = (String[]) JSONArray.toArray(jsonArray, String.class);
登录后复制
    fail(s[0].toString());
登录后复制
    <br/>
登录后复制
    fail("============== XML >>>> Java boolean Array ==================");
登录后复制
    boolean[] bo = { true, false, true };
登录后复制
    jsonArray = (JSONArray) xmlSerializer.read(xmlSerializer.write(JSONArray.fromObject(bo)));
登录后复制
    bo = (boolean[]) JSONArray.toArray(jsonArray, boolean.class);
登录后复制
    fail(bo.toString());
登录后复制
    System.out.println(bo[0]);
登录后复制
    <br/>
登录后复制
    jsonArray = (JSONArray) xmlSerializer.read(xmlSerializer.write(JSONSerializer.toJSON(bo)));
登录后复制
    bo = (boolean[]) JSONArray.toArray(jsonArray, boolean.class);
登录后复制
    fail(bo.toString());
登录后复制
    System.out.println(bo[0]);
登录后复制
    <br/>
登录后复制
    fail("==============Java Object Array >>> JSON Array ==================");
登录后复制
    Object[] o = { 1, "a", true, 'A', sa, bo };
登录后复制
    jsonArray = (JSONArray) xmlSerializer.read(xmlSerializer.write(JSONArray.fromObject(o)));
登录后复制
    System.out.println(jsonArray.getInt(0));
登录后复制
    System.out.println(jsonArray.get(1));
登录后复制
    System.out.println(jsonArray.getBoolean(2));
登录后复制
    jsonArray = (JSONArray) xmlSerializer.read(xmlSerializer.write(JSONSerializer.toJSON(o)));
登录后复制
    System.out.println(jsonArray.get(4));
登录后复制
    System.out.println(jsonArray.getJSONArray(5).get(0));
登录后复制
    System.out.println(jsonArray.get(5));
登录后复制
    <br/>
登录后复制
    fail("==============Java String >>> JSON ==================");
登录后复制
    jsonArray = (JSONArray) xmlSerializer.read(xmlSerializer.write(JSONArray.fromObject("['json','is','easy']")).toString());
登录后复制
    s = (String[]) JSONArray.toArray(jsonArray, String.class);
登录后复制
    fail(s[0].toString());
登录后复制
    jsonObject = (JSONObject) xmlSerializer.read(xmlSerializer.write(JSONObject.fromObject("{'json':'is easy'}")).toString());
登录后复制
    Object obj = JSONObject.toBean(jsonObject);
登录后复制
    System.out.println(obj);
登录后复制
    jsonArray = (JSONArray) xmlSerializer.read(xmlSerializer.write(JSONSerializer.toJSON("['json','is','easy']")).toString());
登录后复制
    s = (String[]) JSONArray.toArray(jsonArray, String.class);
登录后复制
    fail(s[1].toString());
登录后复制
}
登录后复制

主要运用到XMLSerializer的read方法,将xml内容读取后,转换成Java对象。运行后结果如下:

============== XML >>>> Java String Array ==================
登录后复制
["a","b","c"]
登录后复制
a
登录后复制
============== XML >>>> Java boolean Array ==================
登录后复制
[Z@15856a5
登录后复制
true
登录后复制
[Z@79ed7f
登录后复制
true
登录后复制
==============Java Object Array >>> JSON Array ==================
登录后复制
1
登录后复制
a
登录后复制
true
登录后复制
["a","b","c"]
登录后复制
true
登录后复制
["true","false","true"]
登录后复制
==============Java String >>> JSON ==================
登录后复制
JSON
登录后复制
net.sf.ezmorph.bean.MorphDynaBean@c09554[
登录后复制
  {json=is easy}
登录后复制
]
登录后复制
is
登录后复制

3、 将xml的字符串内容,转换成Java的Array对象

@Test
登录后复制
public void testReadXml2Array() {
登录后复制
    String str = "<a class=\"array\">" +
登录后复制
          "<e type=\"function\" params=\"i,j\">" +
登录后复制
          "return matrix[i][j];" +
登录后复制
          "</e>" +
登录后复制
        "</a>";
登录后复制
    JSONArray json = (JSONArray) new XMLSerializer().read(str);
登录后复制
    fail(json.toString());
登录后复制
}
登录后复制

上面是一段xml字符串格式的文档,将其转换为JSONArray对象。转换后结果如下:

[function(i,j){ return matrix[i][j]; }]
登录后复制

就是一个数组;

 以上就是JSON-lib框架,转换JSON、XML不再困难的内容,更多相关内容请关注PHP中文网(www.php.cn)!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号