json格式化屬性自訂-2

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.