JSON-lib是一个Java库用于将 beans, maps, collections, java arrays and XML转换为JSON,并且能将JSON转换为beans或者DynaBeans。下面的表格总结了Java与JavaScript之间类型的转换:
JSON | Java | |
string | <=> | java.lang.String, java.lang.Character, char |
number | <=> | java.lang.Number, byte, short, int, long, float, double |
true|false | <=> | java.lang.Boolean, boolean |
null | <=> | null |
function | <=> | net.sf.json.JSONFunction |
array | <=> | net.sf.json.JSONArray (object, string, number, boolean, function) |
object | <=> | net.sf.json.JSONObject |
JSONSerializer的使用:
在使用Maven引用jsob-lib时,因为json-lib使用jdk1.5进行编译,当使用jdk版本大于1.5时,需要添加classifier,否则pom文件会报错:Missing artifact net.sf.json-lib:json-lib:jar:2.4,如下为JSON-lib 2.4的maven依赖:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
JSONSerializer可以将任何java对象转换为JSON表示法,要将Java 对象转换为JSON,请使用JSONSerializer.toJSON()。要转换有效的JSON值(实现JSON接口的对象[JSONObject,JSONArray,JSONNull]),请使用toJava()。最后一个方法是实例方法,因为序列化程序需要特殊配置才能将JSON值转换为bean类、数组、列表或DynaBean。测试代码如下:
//JSON 转换为Java 对象
//使用JSON.toJava()方法将JSON转换为MorphDynaBean对象
JSONObject json = new JSONObject();
json.put("username", "pharos");
MorphDynaBean dynaBean = (MorphDynaBean) JSONSerializer.toJava(json);
//使用JSON的具体实现类JSONObject,JSONArray,JSONNull可以将JSON转换为具体的beans
//后续会详细讲解JSONObject
User user = (User) JSONObject.toBean(json, User.class);
System.out.println(user.toString());
//使用JSON.toJSON可以将bean转换为JSON
JSON json1 = JSONSerializer.toJSON(user);
System.out.println(json);
//使用JSONObject.fromObject()可以将bean转换为JSOnObject
System.out.println(JSONObject.fromObject(json));
System.out.println(JSONObject.fromObject(user));
数组和集合与JSONArray的转换:
从Java数组或者集合创建JsonArray的最好的方式就是使用JSONArray的fromObject()方法,同时可以通过toList()方法将JSONArray转换为Java集合。
//创建JSONArray
JSONArray jsonArray = new JSONArray();
jsonArray.add("one");
jsonArray.add("two");
jsonArray.add("three");
//通过toList将JSONArray转换为List集合
List<String> list = JSONArray.toList(jsonArray);
System.out.println(list);
//通过toArray转换为Object
Object array = JSONArray.toArray(jsonArray);
System.out.println(array);
//将数组转换为JSONArray
boolean[] boolArray = new boolean[] { true, false, true };
JSONArray jsonArray = JSONArray.fromObject(boolArray);
System.out.println(jsonArray);
//将集合转换为JSONArray
List<String> list = new ArrayList<String>();
list.add( "first" );
list.add( "second" );
JSONArray jsonArray2 = JSONArray.fromObject( list );
System.out.println( jsonArray2 );
//将数组字符串转换为JSONArray
JSONArray jsonArray3 = JSONArray.fromObject( "['json','is','easy']" );
System.out.println( jsonArray3 );
Bean和Map转换为JSON:
从Java Bean或者Map创建JsonArray的最好的方式就是使用JSONObject的fromObject()方法,
//创建Map对象,并转换为JSONObject
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 );
//创建MyBean类
public class MyBean {
private String name = "json";
private int pojoId = 1;
private char[] options = new char[] { 'a', 'f' };
private String func1 = "function(i){ return this.options[i]; }";
private JSONFunction func2 = new JSONFunction(new String[] { "i" }, "return this.options[i];");
//setter,getter方法
}
//将MyBean转换为JSONObject
JSONObject jsonObject2 = JSONObject.fromObject(new MyBean());
System.out.println(jsonObject2);
JSON转换为Map,Bean或者DynaBean:
//将JSON转换为DynaBean
String json = "{name=\"json\",bool:true,integer:1,doubl:2.2,func:function(a){ return a; },array:[1,2]}";
JSONObject jsonObject = JSONObject.fromObject( json );
Object bean = JSONObject.toBean( jsonObject );
System.out.println(PropertyUtils.getProperty( bean, "name" ) );
System.out.println(PropertyUtils.getProperty( bean, "bool" ) );
System.out.println(PropertyUtils.getProperty( bean, "integer" ) );
System.out.println(PropertyUtils.getProperty( bean, "doubl" ) );
System.out.println(PropertyUtils.getProperty( bean, "func" ) );
List expected = JSONArray.toList(jsonObject.getJSONArray("array"));
System.out.println("expected" + expected);
expected = (List) PropertyUtils.getProperty(bean, "array");
System.out.println("expected" + expected);
//将JSON转换为特定的Bean
BeanA bean2 = (BeanA) JSONObject.toBean( jsonObject, BeanA.class );
System.out.println(bean2.toString());
转换为特定bean时有两种特殊情况,如果目标bean具有Map属性并且Map存储的是其他bean,JSONObject.toBean()将把嵌套bean转换为DynaBeans。如果需要将这些嵌套bean转换为特定的类,可以对Map属性进行后处理,也可以提供有关JSONObject属性的提示以进行转换。可以向JSONObject.toBean()传递第三个参数Map,它将提供thos提示。每个键必须是属性的名称或与对象属性匹配的正则表达式,并且该值必须是类。
第二种情况类似,当目标bean有一个集合(列表)作为属性并且它必须包含其他bean时,就会发生这种情况。在这种情况下,无法为类转换提供提示。唯一可能的解决方案是对集合进行后处理,将每个DynaBean转换为特定的bean。
class MyBean{
private List data;
//getters & setters
}
class Person{
private String name;
//getters & setters
}
...
String json = "{'data':[{'name':'Wallace'},{'name':'Grommit'}]}";
Map classMap = new HashMap();
classMap.put( "data", Person.class );
MyBean bean = JSONObject.toBean( JSONObject.fromObject(json), MyBean.class, classMap );