JSON数据转换

来源:互联网 发布:最难防范的网络攻击是 编辑:程序博客网 时间:2024/06/05 08:49

一 、 如何在 java中将数组、对象、Map、List转换成JSON数据

  • 如果要将数组、对象、Map、List转换成JSON数据,那我们需要一些jar包:

       json-lib-2.4-jdk15.jar

      ezmorph-1.0.6.jar

      commons-logging.jar

      commons-lang.jar

      commons-collections.jar

      commons-beanutils.jar

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

      下载地址:

      http://sourceforge.net/projects/json-lib/files/json-lib/json-lib-2.4/
      官方网址:http://json-lib.sourceforge.net/

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

      http://json-lib.sourceforge.net/usage.html

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

package com.hoo.test;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;/*** <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://blog.csdn.net/IBM_hoojo* @email hoojo_@126.com* @version 1.0*/@SuppressWarnings({ "deprecation", "unchecked" })public class JsonlibTest {private JSONArray jsonArray = null;private JSONObject jsonObject = null;private Student bean = null;@Beforepublic void init() {jsonArray = new JSONArray();jsonObject = new JSONObject();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);}@Afterpublic void destory() {jsonArray = null;jsonObject = null;bean = null;System.gc();}public final void fail(String string) {System.out.println(string);}public final void failRed(String string) {System.err.println(string);}}

我们可以看到java类中需要引用哪些包;
如:import net.sf.json.JSONArray;

  上面的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.json.org/json-zh.html

  • 将数组转换为JSON:

String[] arr = {"asd","dfgd","asd","234"};JSONArray jsonarray = JSONArray.fromObject(arr);System.out.println(jsonarray);
  • 对象转换成JSON:
UserInfo user = new UserInfo(1001,"张三");JSONArray jsonArray = JSONArray.fromObject(user);  System.out.println( jsonArray );  
  • 把Map转换成json, 要使用jsonObject对象:
Map<String, Object> map = new HashMap<String, Object>();map.put("userId", 1001);map.put("userName", "张三");map.put("userSex", "男");JSONObject jsonObject = JSONObject.fromObject(map);System.out.println(jsonObject);
  • 把List转换成JSON数据:
List<UserInfo> list = new ArrayList<UserInfo>();UserInfo user = new UserInfo(1001, "张三");list.add(user);list.add(user);list.add(user);JSONArray jsonArray = JSONArray.fromObject(list);System.out.println(jsonArray);

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

/*** <b>function:</b> 转换更多数组类型到JSON* @author hoojo* @createDate Nov 28, 2010 2:39:19 PM*/@Testpublic 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());fail("==============Java JSONArray >>> JSON ==================");jsonArray = new JSONArray().element( "JSON" ).element( "1" ).element( "2.0" ).element( "true" );fail(JSONSerializer.toJSON(jsonArray).toString());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]);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 ==================paramdoSomethingWithParam(param);

  这里还有一个JSONFunction的对象,可以转换JavaScript的function。可以获取方法参数和方法体。同时,还可以用JSONObject、JSONArray构建Java对象,完成Java对象到JSON字符串的转换。
以上为java中将数组、对象、Map、List转换成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*/@Testpublic 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\"}";@Testpublic void readJSON2DynaBean() {try {fail("==============JSON Object String >>> Java MorphDynaBean ==================");JSON jo = JSONSerializer.toJSON(json);Object o = JSONSerializer.toJava(jo);//MorphDynaBeanfail(PropertyUtils.getProperty(o, "address").toString());jsonObject = JSONObject.fromObject(json);fail(jsonObject.getString("email"));o = JSONSerializer.toJava(jsonObject);//MorphDynaBeanfail(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 =============chianemail@123.comtom

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

private String json = "{\"address\":\"chian\",\"birthday\":{\"birthday\":\"2010-11-22\"},"+"\"email\":\"email@123.com\",\"id\":22,\"name\":\"tom\"}";@Testpublic 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);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"}1tom#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\"}";@Testpublic 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));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 ==================1tom#22#chian#2010-11-22#email@123.com1net.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\"}";@Testpublic 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());} catch (Exception e) {e.printStackTrace();}}

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

==============JSON Arry String >>> Java Collection ==================11tom#22#chian#2010-11-22#email@123.com

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

@Testpublic 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);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#emailarr:[a, b]B:jack#1#address#2010-11-22#emailint:1name:jsonbool:true

  三、 JSON-lib对XML的支持

  1、 将Java对象到XML

/*============================Java Object >>>>> XML ==========================*//*** <b>function:</b> 转换Java对象到XML* 需要额外的jar包:xom.jar* @author hoojo* @createDate Nov 28, 2010 2:39:55 PM*/@Testpublic 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*/@Testpublic 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());String[] s = (String[]) JSONArray.toArray(jsonArray, String.class);fail(s[0].toString());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]);jsonArray = (JSONArray) xmlSerializer.read(xmlSerializer.write(JSONSerializer.toJSON(bo)));bo = (boolean[]) JSONArray.toArray(jsonArray, boolean.class);fail(bo.toString());System.out.println(bo[0]);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));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@15856a5true[Z@79ed7ftrue==============Java Object Array >>> JSON Array ==================1atrue["a","b","c"]true["true","false","true"]==============Java String >>> JSON ==================jsonnet.sf.ezmorph.bean.MorphDynaBean@c09554[{json=is easy}]is

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

@Testpublic 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]; }] 就是一个数组。
0 0