<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Gson – 自定義序列化和反序列化 > 原文: [https://howtodoinjava.com/gson/custom-serialization-deserialization/](https://howtodoinjava.com/gson/custom-serialization-deserialization/) Gson 在默認序列化和反序列化方面提供了非常出色的功能。 不過,我們可能會遇到默認和內置自定義選項無法解決我們問題的情況。 在這種情況下,我們可以使用兩個接口`JsonSerializer`和`JsonDeserializer`使用自定義序列化和反序列化。 ## 1.自定義序列化 #### 1.1 `JsonSerializer`接口 [`JsonSerializer`](https://static.javadoc.io/com.google.code.gson/gson/2.8.5/com/google/gson/JsonSerializer.html)接口看起來像這樣: ```java public interface JsonSerializer<T> { public JsonElement serialize(T value, Type type, JsonSerializationContext jsonSerializationContext) { } } ``` 為 Json 創建自定義序列化器之后,我們還需要通過`GsonBuilder.registerTypeAdapter(Type, Object)`注冊該序列化器。 Gson 在遇到指定類型的字段時,會在序列化過程中調用其回調方法`serialize()`。 #### 1.2 Gson `JsonSerializer`示例 假設我們進入一種情況,我們必須將 Java 對象序列化為 json,以便將所有布爾值都寫入`1 or 0`,而不是打印`true or false`。 讓我們為該要求編寫自定義序列化程序。 ```java import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; public class BooleanSerializer implements JsonSerializer<Boolean> { public JsonElement serialize(Boolean aBoolean, Type type, JsonSerializationContext jsonSerializationContext) { if(aBoolean){ return new JsonPrimitive(1); } return new JsonPrimitive(0); } } ``` 讓我們編寫一個程序,使用`registerTypeAdapter()`注冊`JsonSerializer`實例,然后使用它將 Java 對象序列化為 json。 ```java import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class Main { public static void main(String[] args) throws Exception { Employee emp = new Employee(1, "Lokesh", "Gupta", "howtodoinjava@gmail.com", true); Gson gson = new GsonBuilder() .registerTypeAdapter(Boolean.class, new BooleanSerializer()) .setPrettyPrinting() .create(); String json = gson.toJson(emp); System.out.println(json); } } ``` 注意程序輸出,鍵“`active`”的值被序列化為 1。 ```java { "id": 1, "firstName": "Lokesh", "lastName": "Gupta", "email": "howtodoinjava@gmail.com", "active": 1 } ``` ## 2.自定義反序列化 #### 2.1 `JsonDeserializer`接口 自定義反序列化器必須實現[`JsonDeserializer`](https://static.javadoc.io/com.google.code.gson/gson/2.8.5/com/google/gson/JsonDeserializer.html)接口。 `JsonDeserializer`接口如下所示: ```java public interface JsonDeserializer<T> { public Boolean deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException; } ``` 為 Json 創建自定義反序列化器之后,我們還需要通過`GsonBuilder.registerTypeAdapter(Type, Object)`注冊此反序列化器。 Gson 在遇到指定類型的字段時,會在序列化過程中調用其回調方法`deserialize()`。 #### 2.2 Gson `JsonDeserializer`示例 假設某些服務將日期字段分別分為天,月和年等部分分別返回給我們。 在 JSON 字符串中,它們可能有意義,但在 Java 中,它們只有作為單個`java.time.LocalDate`對象的一部分時才有意義。 ```java { "id": 1, "firstName": "Lokesh", "lastName": "Gupta", "email": "howtodoinjava@gmail.com", "day": 11, "month": 8, "year": 2019 } ``` 我們要自定義反序列化并將最后三個字段組合為[`LocalDate`](https://howtodoinjava.com/java/date-time/java-time-localdate-class/)對象。 我們的`Employee`看起來像這樣。 包括必要的獲取器和設置器以及構造器。 ```java public class Employee { private Integer id; private String firstName; private String lastName; private String email; private LocalDate dob; } ``` 自定義反序列化器類如下所示: ```java import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; public class EmployeeDeserializer implements JsonDeserializer<Employee> { @Override public Employee deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject jsonObject = json.getAsJsonObject(); LocalDate localDate = LocalDate.of( jsonObject.get("year").getAsInt(), jsonObject.get("month").getAsInt(), jsonObject.get("day").getAsInt() ); return new Employee( jsonObject.get("id").getAsInt(), jsonObject.get("firstName").getAsString(), jsonObject.get("lastName").getAsString(), jsonObject.get("email").getAsString(), localDate); } } ``` 讓我們注冊反序列化器,然后將給定的 JSON 解析為 java 對象。 ```java public class Main { public static void main(String[] args) throws Exception { String json = "{'id': 1001," + "'firstName': 'Lokesh'," + "'lastName': 'Gupta'," + "'email': 'howtodoinjava@gmail.com', " + "'day': 11, " + "'month': 8, " + "'year': 2019}"; Gson gson = new GsonBuilder() .registerTypeAdapter(Employee.class, new EmployeeDeserializer()) .create(); Employee employee = gson.fromJson(json, Employee.class); System.out.println(employee); } } ``` 注意程序輸出如何將 3 個單獨的字段組合成單個`LocalDate`對象。 ```java Employee [id=1001, firstName=Lokesh, lastName=Gupta, email=howtodoinjava@gmail.com, dob=2019-08-11] ``` 根據提供的 json 輸入的保證,我們可能想用`has()`來檢查`JsonObject`中是否存在模型屬性。 否則,如果我們正在訪問屬性,然后嘗試獲取該屬性的值,則可能會遇到`NullPointerException`。 向我提供有關 Java 中使用 Gson 的*自定義序列化和反序列化*的問題。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看