json-lib API 使用详解

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 );  

 

发布了14 篇原创文章 · 获赞 1 · 访问量 1547
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览