站長資訊網
        最全最豐富的資訊網站

        Fastjson 簡明教程


        Fastjson 簡介

        Fastjson 是一個 Java 庫,可以將 Java 對象轉換為 JSON 格式,當然它也可以將 JSON 字符串轉換為 Java 對象。

        Fastjson 可以操作任何 Java 對象,即使是一些預先存在的沒有源碼的對象。

        Fastjson 源碼地址:https://github.com/alibaba/fastjson

        Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN


        Fastjson 特性

        • 提供服務器端、安卓客戶端兩種解析工具,性能表現較好。
        • 提供了 toJSONString() 和 parseObject() 方法來將 Java 對象與 JSON 相互轉換。調用toJSONString方 法即可將對象轉換成 JSON 字符串,parseObject 方法則反過來將 JSON 字符串轉換成對象。
        • 允許轉換預先存在的無法修改的對象(只有class、無源代碼)。
        • Java泛型的廣泛支持。
        • 允許對象的自定義表示、允許自定義序列化類。
        • 支持任意復雜對象(具有深厚的繼承層次和廣泛使用的泛型類型)。

        Fastjson 簡明教程


        下載和使用

        你可以在 maven 中央倉庫中直接下載:

        http://repo1.maven.org/maven2/com/alibaba/fastjson/

        或者配置 maven 依賴:

        <dependency>      <groupId>com.alibaba</groupId>      <artifactId>fastjson</artifactId>      <version>x.x.x</version>  </dependency>

        其中 x.x.x 是版本號,根據需要使用特定版本,建議使用最新版本。


        將 Java 對象轉換為 JSON 格式

        定義以下 Person JavaBean:

        public class Person {             @JSONField(name = "AGE")      private int age;         @JSONField(name = "FULL NAME")      private String fullName;         @JSONField(name = "DATE OF BIRTH")      private Date dateOfBirth;         public Person(int age, String fullName, Date dateOfBirth) {          super();          this.age = age;          this.fullName= fullName;          this.dateOfBirth = dateOfBirth;      }         // 標準 getters & setters  }

        可以使用 JSON.toJSONString() 將 Java 對象轉換換為 JSON 對象:

        private List<Person> listOfPersons = new ArrayList<Person>();     @Before  public void setUp() {      listOfPersons.add(new Person(15, "John Doe", new Date()));      listOfPersons.add(new Person(20, "Janette Doe", new Date()));  }     @Test  public void whenJavaList_thanConvertToJsonCorrect() {      String jsonOutput= JSON.toJSONString(listOfPersons);  }

        輸出結果為:

        [        {            "AGE":15,          "DATE OF BIRTH":1468962431394,          "FULL NAME":"John Doe"      },      {            "AGE":20,          "DATE OF BIRTH":1468962431394,          "FULL NAME":"Janette Doe"      }  ]

        我們還可以自定義輸出,并控制字段的排序,日期顯示格式,序列化標記等。

        接下來我們更新 bean 并添加幾個字段:

        @JSONField(name="AGE", serialize=false)  private int age;     @JSONField(name="LAST NAME", ordinal = 2)  private String lastName;     @JSONField(name="FIRST NAME", ordinal = 1)  private String firstName;     @JSONField(name="DATE OF BIRTH", format="dd/MM/yyyy", ordinal = 3)  private Date dateOfBirth;

        以上代碼中我們列出了基本參數類別,并使用 @JSONField 注解,以便實現自定義轉換:

        • format 參數用于格式化 date 屬性。
        • 默認情況下, FastJson 庫可以序列化 Java bean 實體, 但我們可以使用 serialize 指定字段不序列化。
        • 使用 ordinal 參數指定字段的順序

        這樣,以上輸出結果為:

        [      {          "FIRST NAME":"Doe",          "LAST NAME":"Jhon",          "DATE OF BIRTH":"19/07/2016"      },      {          "FIRST NAME":"Doe",          "LAST NAME":"Janette",          "DATE OF BIRTH":"19/07/2016"      }  ]

        @JSONField

        @JSONField 的作用對象:

        • 1. Field
        • 2. Setter 和 Getter 方法

        注意:FastJson 在進行操作時,是根據 getter 和 setter 的方法進行的,并不是依據 Field 進行。

        注意:若屬性是私有的,必須有 set 方法。否則無法反序列化。

        package com.alibaba.fastjson.annotation;    public @interface JSONField {      // 配置序列化和反序列化的順序,1.1.42版本之后才支持      int ordinal() default 0;         // 指定字段的名稱      String name() default "";        // 指定字段的格式,對日期格式有用      String format() default "";        // 是否序列化      boolean serialize() default true;        // 是否反序列化      boolean deserialize() default true;  }

        2. JSONField配置方式

        FieldInfo 可以配置在 getter/setter 方法或者字段上。例如:

        2.1 配置在 getter/setter 上

           public class A {        private int id;           @JSONField(name="ID")        public int getId() {return id;}        @JSONField(name="ID")        public void setId(int value) {this.id = id;}  }  

        2.2 配置在 field 上

           public class A {        @JSONField(name="ID")        private int id;           public int getId() {return id;}        public void setId(int value) {this.id = id;}   }  

        3. 使用format配置日期格式化

         public class A {        // 配置date序列化和反序列使用yyyyMMdd日期格式        @JSONField(format="yyyyMMdd")        public Date date;   }

        4. 使用 serialize/deserialize 指定字段不序列化

        public class A {        @JSONField(serialize=false)        public Date date;   }     public class A {        @JSONField(deserialize=false)        public Date date;   }

        5. 使用 ordinal 指定字段的順序

        缺省 fastjson 序列化一個 java bean,是根據 fieldName 的字母序進行序列化的,你可以通過 ordinal 指定字段的順序。這個特性需要 1.1.42 以上版本。

        public static class VO {      @JSONField(ordinal = 3)      private int f0;        @JSONField(ordinal = 2)      private int f1;        @JSONField(ordinal = 1)      private int f2;  }

        FastJson 還支持 BeanToArray 序列化功能:

        String jsonOutput= JSON.toJSONString(listOfPersons, SerializerFeature.BeanToArray);

        輸出結果為:

        [      [          15,          1469003271063,          "John Doe"      ],      [          20,          1469003271063,          "Janette Doe"      ]  ]

        創建 JSON 對象

        創建 JSON 對象非常簡單,只需使用 JSONObject(fastJson提供的json對象) 和 JSONArray(fastJson提供json數組對象) 對象即可。

        我們可以把JSONObject 當成一個 Map<String,Object> 來看,只是 JSONObject 提供了更為豐富便捷的方法,方便我們對于對象屬性的操作。我們看一下源碼。

        Fastjson 簡明教程

        同樣我們可以把 JSONArray 當做一個 List<Object>,可以把 JSONArray 看成 JSONObject 對象的一個集合。

        Fastjson 簡明教程

        此外,由于 JSONObject 和 JSONArray 繼承了 JSON,所以說也可以直接使用兩者對 JSON 格式字符串與 JSON 對象及 javaBean 之間做轉換,不過為了避免混淆我們還是使用 JSON。

        @Test  public void whenGenerateJson_thanGenerationCorrect() throws ParseException {      JSONArray jsonArray = new JSONArray();      for (int i = 0; i < 2; i++) {          JSONObject jsonObject = new JSONObject();          jsonObject.put("AGE", 10);          jsonObject.put("FULL NAME", "Doe " + i);          jsonObject.put("DATE OF BIRTH", "2016/12/12 12:12:12");          jsonArray.add(jsonObject);      }      String jsonOutput = jsonArray.toJSONString();  }

        輸出結果為:

        [     {        "AGE":"10",        "DATE OF BIRTH":"2016/12/12 12:12:12",        "FULL NAME":"Doe 0"     },     {        "AGE":"10",        "DATE OF BIRTH":"2016/12/12 12:12:12",        "FULL NAME":"Doe 1"     }  ]

        JSON 字符串轉換為 Java 對象

        現在我們已經學會了如何創建 JSON 對象,以及如何將 Java 對象轉換為 JSON 字符串,接下來我們就需要了解如何解析 JSON:

        @Test  public void whenJson_thanConvertToObjectCorrect() {      Person person = new Person(20, "John", "Doe", new Date());      String jsonObject = JSON.toJSONString(person);      Person newPerson = JSON.parseObject(jsonObject, Person.class);             assertEquals(newPerson.getAge(), 0); // 如果我們設置系列化為 false      assertEquals(newPerson.getFullName(), listOfPersons.get(0).getFullName());  }

        我們可以使用 JSON.parseObject() 將 JSON 字符串轉換為 Java 對象。

        注意反序列化時為對象時,必須要有默認無參的構造函數,否則會報異常:

        com.alibaba.fastjson.JSONException: default constructor not found.

        以下是簡單的實例測試:

        Person [age=20, fullName=John Doe, dateOfBirth=Wed Jul 20 08:51:12 WEST 2016]

        @JSONField deserialize 可選項可以指定字段不反序列化。

        @JSONField(name = "DATE OF BIRTH", deserialize=false)  private Date dateOfBirth;

        輸出結果為:

        Person [age=20, fullName=John Doe, dateOfBirth=null]

        使用 ContextValueFilter 配置 JSON 轉換

        在某些場景下,對Value做過濾,需要獲得所屬JavaBean的信息,包括類型、字段、方法等。在fastjson-1.2.9中,提供了ContextValueFilter,類似于之前版本提供的ValueFilter,只是多了BeanContext參數可用。

        @Test  public void givenContextFilter_whenJavaObject_thanJsonCorrect() {      ContextValueFilter valueFilter = new ContextValueFilter () {          public Object process(            BeanContext context, Object object, String name, Object value) {              if (name.equals("DATE OF BIRTH")) {                  return "NOT TO DISCLOSE";              }              if (value.equals("John")) {                  return ((String) value).toUpperCase();              } else {                  return null;              }          }      };      String jsonOutput = JSON.toJSONString(listOfPersons, valueFilter);  }

        以上實例中我們隱藏了 DATE OF BIRTH 字段,并過濾名字不包含 John 的字段:

        [      {          "FULL NAME":"JOHN DOE",          "DATE OF BIRTH":"NOT TO DISCLOSE"      }  ]

        使用 NameFilter 和 SerializeConfig

        NameFilter: 序列化時修改 Key。

        SerializeConfig:內部是個map容器主要功能是配置并記錄每種Java類型對應的序列化類。

        @Test  public void givenSerializeConfig_whenJavaObject_thanJsonCorrect() {      NameFilter formatName = new NameFilter() {          public String process(Object object, String name, Object value) {              return name.toLowerCase().replace(" ", "_");          }      };             SerializeConfig.getGlobalInstance().addFilter(Person.class,  formatName);      String jsonOutput =         JSON.toJSONStringWithDateFormat(listOfPersons, "yyyy-MM-dd");  }

        實例中我們聲明了 formatName 過濾器使用 NameFilter 匿名類來處理字段名稱。 新創建的過濾器與 Person 類相關聯,然后添加到全局實例,它是 SerializeConfig 類中的靜態屬性。

        現在我們可以輕松地將對象轉換為JSON格式。

        注意我們使用的是 toJSONStringWithDateFormat() 而不是 toJSONString() ,它可以更快速的格式化日期。

        輸出結果:

        [        {            "full_name":"John Doe",          "date_of_birth":"2016-07-21"      },      {            "full_name":"Janette Doe",          "date_of_birth":"2016-07-21"      }  ]
        贊(1)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲国产精品成人久久蜜臀| 国产精品成人观看视频免费| 99在线精品视频在线观看| 国产乱码精品一区二区三| A级精品国产片在线观看| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 成人国产精品高清在线观看| 亚洲精品乱码久久久久久按摩 | 99国内精品久久久久久久| 精品久久久久久国产91| 91精品成人免费国产| 国产L精品国产亚洲区久久| 久久久精品人妻无码专区不卡| 在线亚洲精品福利网址导航| 国产福利91精品一区二区三区| 精品人妻伦一二三区久久| 午夜精品射精入后重之免费观看 | 国产欧美日韩综合精品二区| 亚洲精品你懂的在线观看| 久久精品国产91久久麻豆自制| 欧美成人精品高清在线播放 | 日韩精品久久久久久免费| 亚洲无删减国产精品一区| 无码人妻精品一区二区三区久久久| 亚洲精品在线观看视频| 欧美性videos高清精品| 免费短视频软件精品一区二区| 日本一区二区三区精品中文字幕| 日韩AV无码精品人妻系列| 精品久久综合1区2区3区激情| 8x福利精品第一导航| 无码精品国产VA在线观看| 精品视频一区二区三区四区五区| 国产a精品视频| 少妇伦子伦精品无码STYLES| 四虎国产精品永免费| 精品无码久久久久久国产| www夜片内射视频日韩精品成人| 国产91精品在线| 国产91大片精品一区在线观看| 国语精品一区二区三区|