標籤:json
概述:
在Java web開發中免不了要將Java對象格式化成json資料形式返回到用戶端,而提供格式化功能的工具也很多,其中以fastjson速度最快。
但是fastjson在使用中顯得還不夠那麼盡人意,
1. 沒有提供一個方便點方法來實現過濾屬性;
2. 沒有提供多條格式化資料整合在一起,而以一個key來對其關聯。
一個po對象User如下定義
public class User {
private int id;
private String name;
private String ip;
private int age;
}
而此時如果只想格式化其中的id和ip兩個屬性,那麼怎麼辦?
格式化的資料大概是:{"id":xxx,"ip":"xxx"}
如果想要對這個對象加個key呢?比如是:
{"user1":{"id":xxx,"ip":"xxx"}}
加一個key可以通過,將一個user對象儲存在一個map對象中,然後對map對象格式得到,那麼怎麼過濾屬性呢?
又假如此時想格式化兩個user對象,其中一個只格式化id,另一個則格式化age和name,那麼怎麼辦?
格式化的資料大概是:{"user1":{"id":xxx},"user2":{"age":xxx,"name":"xxx"}}
這個也可以通過一個map中設定多個值達到效果,如:
Map<String, User> map = new HashMap<String, User>();
map.put("user1", new User());
map.put("user2", new User());
然後對這個map進行格式化即可得到上面的效果。
可是不能對第一個user只格式化id,而第二個user只格式化age和name。
這些原生的fastjson都沒有提供好的解決方案。
過濾屬性是的確是提供了方法,如:
PropertyFilter filter = new PropertyFilter() {public boolean apply(Object source, String propertyName, Object value) {if (source instanceof Map) {Class<? extends Object> clazz = value.getClass();Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {String fieldname = field.getName();for (String name : propertyNames) {if (name.equals(fieldname)) {return keeped;}}return true;}} else {for (String name : propertyNames) {if (name.equals(propertyName)) {return keeped;}}return !keeped;}return true;}};SerializeWriter writer = new SerializeWriter();JSONSerializer serializer = new JSONSerializer(writer);serializer.getPropertyFilters().add(filter);serializer.write(object);return writer.toString();
然而如果每次過濾屬性的時候都去寫這樣的代碼,想必一定是十分的累人。因而可不可以對進行一定的封裝而得到一個好用的方法呢?
假如有這樣一個方法:
toJSON(final Object object, final boolean keeped, final String... propertyNames)
object:需要格式化的任意對象
keeped:屬性格式化還是不格式化的一個標誌,true:表示格式化;false:表示不格式化。
propertyNames:自定以的屬性名稱列表。
當調用這個方法即可自訂屬性格式化。
如果這個方法可以是實現,那麼自訂屬性格式化在編程上將變得簡單。
不過以上方法不能很好的實現,
{"user1":{"id":xxx},"user2":{"age":xxx,"name":"xxx"}}
這種類型的格式化。
那麼以是否可以提供一個這樣的方法:
element(String key, final Object object, final boolean keeped, final String... propertyNames)
key:表示上面的"user1"或者"user2"
如果這個方法也得意實現,那麼自訂屬性格式化在編程上變得靈活自在。
在附件中已經實現了這樣的封裝,名稱為fastjson_uper_1.0.jar其意是對fastjson的一個更加方便的使用包。在jar包中已經包含了fastjson.jar所以在使用的時候無須再關聯。
裡面只有一個核心類JSONUtil
它直接繼承自JSONObject類,所以fastjson原生的方法,都可以通過JSONUtil來使用。
其中提供了上面提到的方便的,靈活的,對屬性自訂格式的方法toJSON,還有element。
toJSON是一個靜態方法,可以直接使用。
而element需要建立一個JSONUtil對象才能使用。
element的功能更加強大,因為它可以實現{"user1":{"id":xxx},"user2":{"age":xxx,"name":"xxx"}}這樣的格式化操作。
比如:
JSONUtil jsonUtil = new JSONUtil();
jsonUtil.element("user", user, true, "ip");
jsonUtil.element("userList", list, false, "ip", "pwd");
jsonUtil.element("maps", map, true, "ip", "pwd");
jsonUtil.element("set", set, true, "ip");
jsonUtil.element("maps1", subUserMap, true, "ip", "pwd");
jsonUtil.element("user4", user);
System.out.println(jsonUtil.toString());
最後調用toString方法即可得到格式化好的json資料。
在上一篇部落格的附件中有json-lib和fastjson靈活格式化的源碼,當然fastjson那塊不完整。而在本片部落格附件中對fastjson的封裝是完整的。jar中包含了原始碼。
json格式化屬性自訂-2