Android的資料處理:使用annotation實現JSON字串解析為java對象

來源:互聯網
上載者:User

Annotation是Java語言所提供的一種很有用的機制,特別在用於Java對象的描述化處理時能大大簡化代碼量。在閱讀本文之前最好先瞭解一下Java Annotation的基礎知識,在這一方面在網上很容易找到學習資料,比如下面這一篇: JAVA ANNOTATION詳解JSON與Java對象之間的形式化轉換在一些J2EE的架構中有提供,但是在Android中沒有實現。本文主要介紹如何通過annotation實現一種形式化的方法,在Android上實現JSON字串與Java對象之間的相互轉化。 首先定義一個用於annotaion類型,在定義Java類時,可以使用該類型來標記哪些域(Field)需要輸出到JSON字串中。  [java]  @Target({ElementType.FIELD})  @Retention(RetentionPolicy.RUNTIME)   public @interface JSONValue {      String tag() default "";  }   該annotation包括一個變數tag,這是指其所標記的域在JSON字串中的前置字串(名稱)。然後定義一個轉換工具類,用於Java對象與JSON對象之間的轉換。 [java] public class JSONConverter {        public static void fromJSon(String json_string, Object o) throws Exception {          JSONObject = new JSONObject(json_string);                  JSONObject jo = new JSONObject();          Field[] fields = o.getClass().getFields();          for(Field f : fields) {              if(f.isAnnotationPresent(QueryValue.class)) {                  JSONValue jv = f.getAnnotation(JSONValue.class);                  String tag = jv.tag();if(tag.length() > 0) {                      if(f.getType().getSimpleName().equals("int")) {                          f.setInt(o, jo.optInt(tag));                      }                      else {                          f.set(o, jo.optString(tag));                      }                  }              }          }          return jo.toString();      }            public static String toJSon(Object o) throws Exception {          JSONObject = new JSONObject();          Field[] fields = o.getClass().getFields();          for(Field f : fields) {              if(f.isAnnotationPresent(QueryValue.class)) {                  JSONValue jv = f.getAnnotation(JSONValue.class);                  String tag = jv.tag();                  if(tag.length() > 0) {                      if(f.getType().getSimpleName().equals("int")) {                          jo.put(tag, f.getInt(o));                      }                      else {                          Object v = f.get(o);                          if(v != null) jo.put(tag, v);                      }                  }              }          }          return jo.toString();      }  }   上述工具類實現了兩個靜態方法:fromJSON()用於從JSON對象中解析出Java對象,toJSON()用於將一個Java對象轉換為JSON對象。在上述樣本中僅支援int、String兩種資料類型,這已經能滿足絕大多數應用的需要。如果還想支援其它類型,則需要根據樣本進行修改。另外,上述樣本尚不支援JSON數群組類型。  然後是定義需要轉為為JSON對象的Java類型,定義時需要使用前面定義的annotation,比如:[java]  class MyObject {      @JSONValue(tag="id")      public int mId;      @JSONValue(tag="name")      public String mName;  }   在定義需要輸出到JSON對象的域時,將該域定義為public類型,並使用JSONValue進行標記,同時指定該域在JSON對象中的前置字串(名稱)。在使用時可以很簡單地將該類型的對象轉為JSON字串:[java] MyObject o = new MyObject();  o.mId = 123;  o.mName = "張三";  String json = JSONConverter.toJSON(o);   轉換後的JSON字串型為:{"id":123,"name":"張三”};JSON字串也可以很容易解析成Java對象:[java] String json_string =  {"id":123,"name":"張三”};  MyObject o = new MyObject();  JSONConverter.fromJSON(json_string, o);   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.