亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Java中使用Moshi?JSON庫的方法詳解

 更新時間:2024年04月08日 16:00:16   作者:磊磊落落  
Moshi?是一個可用于?Java?與?Kotlin?的?JSON?序列化與反序列化庫,其主要使用?Kotlin?編寫,本文以樣例代碼的方式來演示該庫在?Java?中的使用,需要的朋友可以參考下

Moshi 是一個可用于 Java 與 Kotlin 的 JSON 序列化與反序列化庫,其主要使用 Kotlin 編寫。本文以樣例代碼的方式來演示該庫在 Java 中的使用。

示例項目使用 Maven 管理,下面列出寫作本文時用到的 JDK、Maven 及 Moshi 的版本:

JDK:Amazon Corretto 17.0.8
Maven:3.9.2
Moshi:1.18.30

開始前,需要在pom.xml<dependencies>下引入 Moshi 依賴(moshi為核心模塊,moshi-adapters模塊包含諸如Date類型處理等實用的 Adapter):

<!-- pom.xml -->
<dependency>
    <groupId>com.squareup.moshi</groupId>
    <artifactId>moshi</artifactId>
    <version>1.18.30</version>
</dependency>
<dependency>
    <groupId>com.squareup.moshi</groupId>
    <artifactId>moshi-adapters</artifactId>
    <version>1.18.30</version>
</dependency>

為了省去編寫繁瑣的SettersGetters,該示例項目還使用了 Lombok,依賴如下:

<!-- pom.xml -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

此外,我們以編寫 JUnit 單元測試的方式來演示 Moshi 的使用,所以還需引入junit-jupiter依賴:

<!-- pom.xml -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.10.0</version>
    <scope>test</scope>
</dependency>

準備好后,即可以開始使用了。

1 基礎使用

首先,看一下最基礎的使用,即如何使用 Moshi 進行序列化與反序列化(即 Java 對象轉換為 JSON,以及 JSON 轉換為 Java 對象)。

先新建一個 Model 類,本文以User為例,該類有三個字段:name、rolescreatedAt,包括了StringList、Date以及枚舉類型。

// src/main/java/com/example/demo/model/User.java
package com.example.demo.model;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.util.Date;
import java.util.List;

@ToString
@Getter
@Setter
@NoArgsConstructor
public class User {

    private String name;
    private List<Role> roles;
    private Date createdAt;

    public enum Role {
        ADMIN,
        EDITOR,
        VIEWER
    }
}

下面即編寫一個測試用例來演示 User 對象與 JSON 的互轉:

// src/test/java/com/example/demo/MoshiTest#testBasicUsage
@Test
public void testBasicUsage() {
    // 構造 Moshi 實例
    Moshi moshi = new Moshi.Builder()
            .add(Date.class, new Rfc3339DateJsonAdapter())
            .build();

    // 獲取 User 的 JsonAdapter
    JsonAdapter<User> jsonAdapter = moshi.adapter(User.class);

    // 構造 User 對象
    User user = new User();
    user.setName("Larry");
    user.setRoles(List.of(User.Role.ADMIN, User.Role.EDITOR));
    user.setCreatedAt(new Date());

    // 序列化
    String json = jsonAdapter.toJson(user);
    System.out.println(json);

    // 反序列化
    try {
        User userParsed = jsonAdapter.fromJson(json);
        System.out.println(userParsed);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

需要注意的是,如上代碼在構造 Moshi 實例時指定了Date類型對應的 JSON Adapter Rfc3339DateJsonAdapter,否則在解析該類型字段時會報錯。

如上代碼運行結果如下:

{"createdAt":"2023-10-14T09:47:37.763Z","name":"Larry","roles":["ADMIN","EDITOR"]}
User(name=Larry, roles=[ADMIN, EDITOR], createdAt=Sat Oct 14 17:47:37 CST 2023)

可以看到,User 對象序列化為的 JSON、JSON 反序列化為的 User 對象都是正確的。

2 使用 @Json 自定義字段名

上面的例子中,JSON 里的字段名與 Java 類里的屬性名是完全一致的。

如果某個字段名需要自定義,該怎么做呢?下面即進行了演示:

// src/main/java/com/example/demo/model/User.java
package com.example.demo.model;

@ToString
@Getter
@Setter
@NoArgsConstructor
public class User {
    // ...

    @Json(name = "created_at")
    private Date createdAt;

    // ...
}

可以看到,只需在 Java 類對應的屬性上加上@Json注解,然后自定義其名稱就可以了。

再次運行一下上面的測試用例(src/test/java/com/example/demo/MoshiTest#testBasicUsage),得到了如下結果:

{"created_at":"2023-10-14T09:55:48.793Z","name":"Larry","roles":["ADMIN","EDITOR"]}
User(name=Larry, roles=[ADMIN, EDITOR], createdAt=Sat Oct 14 17:55:48 CST 2023)

可以看到,User 類的createdAt屬性在序列化為 JSON 時變?yōu)榱?code>created_at;該 JSON 再次反序列化為 User 對象時,createdAt屬性的賦值也是正常的。

3 自定義 Adapter

前面的例子中,我們?yōu)?code>Date類型指定了 Moshi 自帶的 Adapter Rfc3339DateJsonAdapter 來支持其解析。如果覺得這個 Adapter 解析后的日期格式不是想要的,有辦法自己指定嗎?當然是可以的,Moshi 支持我們針對某種類型使用自定義 Adapter 來實現其序列化與反序列化邏輯。

下面即對 User 類中的枚舉類型Role編寫一個自定義 Adapter 來實現其自定義解析:

// src/main/java/com/example/demo/adapter/RoleAdapter.java
package com.example.demo.adapter;

import com.example.demo.model.User;
import com.squareup.moshi.FromJson;
import com.squareup.moshi.ToJson;

public class RoleAdapter {

    @ToJson
    public String toJson(User.Role role) {
        return role.name().substring(0, 1);
    }

    @FromJson
    public User.Role fromJson(String role) {
        switch (role.charAt(0)) {
            case 'A':
                return User.Role.ADMIN;
            case 'E':
                return User.Role.EDITOR;
            case 'V':
                return User.Role.VIEWER;
        }
        return null;
    }

}

可以看到,我們?yōu)?code>Role類型編寫一個自定義 Adapter RoleAdapter。該類中有兩個方法toJsonfromJson,且分別被加上了注解@ToJson@FromJson,這兩個方法分別用于Role類型由 Java 屬性轉為 JSON 字段以及由 JSON 字段轉換為 Java 屬性時的邏輯(本示例僅取第一個字母來表示 User 擁有的Role)。

下面編寫一個測試用例來演示該自定義 Adapter 的使用:

// src/test/java/com/example/demo/MoshiTest#testCustomTypeAdapter
@Test
public void testCustomTypeAdapter() {
    // 構造 Moshi 實例
    Moshi moshi = new Moshi.Builder()
            .add(Date.class, new Rfc3339DateJsonAdapter())
            .add(new RoleAdapter())
            .build();

    // 獲取 User 的 JsonAdapter
    JsonAdapter<User> jsonAdapter = moshi.adapter(User.class);

    // 構造 User 對象
    User user = new User();
    user.setName("Larry");
    user.setRoles(List.of(User.Role.ADMIN, User.Role.EDITOR));
    user.setCreatedAt(new Date());

    // 序列化
    String json = jsonAdapter.toJson(user);
    System.out.println(json);

    // 反序列化
    try {
        User userParsed = jsonAdapter.fromJson(json);
        System.out.println(userParsed);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

可以看到,只需在構造 Moshi 實例時,添加上該 Adapter 即可。

運行一下該測試用例,得到的結果如下:

{"created_at":"2023-10-14T10:39:04.174Z","name":"Larry","roles":["A","E"]}
User(name=Larry, roles=[ADMIN, EDITOR], createdAt=Sat Oct 14 18:39:04 CST 2023)

可以看到,User 對象序列化為的 JSON 中,roles字段的值使用了我們的自定義邏輯(僅取第一個字母來表示 User 的 Role);該 JSON 再次反序列化為的 User 對象也使用了我們的自定義邏輯,反序列化結果也是正確的。

4 JSON 數組如何處理?

上面演示的均為 Java 對象與 JSON 對象的互相轉換,Java List 如何與 JSON 數組互相轉換呢?

下面的測試用例作了演示:

// src/test/java/com/example/demo/MoshiTest#testJSONArrayParsing
@Test
public void testJSONArrayParsing() {
    // 新建一個類型
    Type type = Types.newParameterizedType(List.class, User.class);

    // 構造 Moshi 實例
    Moshi moshi = new Moshi.Builder()
            .add(Date.class, new Rfc3339DateJsonAdapter())
            .add(new RoleAdapter())
            .build();

    // 獲取 User 的 JsonAdapter
    JsonAdapter<List<User>> jsonAdapter = moshi.adapter(type);

    // 構造 User 對象
    User user = new User();
    user.setName("Larry");
    user.setCreatedAt(new Date());
    user.setRoles(List.of(User.Role.ADMIN, User.Role.EDITOR));

    // 序列化
    String json = jsonAdapter.toJson(List.of(user));
    System.out.println(json);

    // 反序列化
    try {
        List<User> usersParsed = jsonAdapter.fromJson(json);
        System.out.println(usersParsed);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

可以看到,只需新建一個 Moshi Type 即可,使用起來也一樣簡單。

如上測試用例的運行結果如下:

[{"created_at":"2023-10-14T11:22:27.153Z","name":"Larry","roles":["A","E"]}]
[User(name=Larry, roles=[ADMIN, EDITOR], createdAt=Sat Oct 14 19:22:27 CST 2023)]

可以看到,User List 與 JSON Array 的互相轉換結果均是正確的。

綜上,本文探索了在 Java 中使用 Moshi 進行 JSON 序列化和反序列化的各種常見用法。

到此這篇關于在Java中使用Moshi JSON庫方法詳解的文章就介紹到這了,更多相關Java中使用Moshi JSON庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java多線程并發(fā)之ReentrantLock

    Java多線程并發(fā)之ReentrantLock

    這篇文章主要介紹了Java?多線程并發(fā)ReentrantLock,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2023-04-04
  • Spring中的Devtools源碼解析

    Spring中的Devtools源碼解析

    這篇文章主要介紹了Spring中的Devtools源碼解析,Spring中的Devtools是一個開發(fā)工具,旨在提高開發(fā)人員的生產力和開發(fā)體驗,它提供了一系列功能,包括自動重啟、熱部署、遠程調試等,使開發(fā)人員能夠更快速地進行代碼修改和調試,需要的朋友可以參考下
    2023-10-10
  • java封裝全局異常處理深入詳解

    java封裝全局異常處理深入詳解

    這篇文章主要為大家介紹了java封裝全局異常處理的深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • java實現文件和base64相互轉換

    java實現文件和base64相互轉換

    這篇文章主要為大家詳細介紹了java如何實現文件和base64相互轉換,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • Spring容器注冊組件實現過程解析

    Spring容器注冊組件實現過程解析

    這篇文章主要介紹了Spring容器注冊組件實現過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Java編程實現向文本文件中讀取數據之Scanner用法示例

    Java編程實現向文本文件中讀取數據之Scanner用法示例

    這篇文章主要介紹了Java編程實現向文本文件中讀取數據之Scanner用法,結合實例形式分析了java使用Scanner類讀取文本文件相關操作技巧與注意事項,需要的朋友可以參考下
    2018-03-03
  • logback 實現給變量指定默認值

    logback 實現給變量指定默認值

    這篇文章主要介紹了logback 實現給變量指定默認值操作,具有很好的參考家價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java非侵入式API接口文檔工具apigcc用法詳解

    Java非侵入式API接口文檔工具apigcc用法詳解

    這篇文章主要介紹了Java非侵入式API接口文檔工具apigcc用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • SpringMVC 跨重定向請求傳遞數據的方法實現

    SpringMVC 跨重定向請求傳遞數據的方法實現

    這篇文章主要介紹了SpringMVC 跨重定向請求傳遞數據的方法實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • mybatis模糊查詢、分頁和別名配置的方法

    mybatis模糊查詢、分頁和別名配置的方法

    這篇文章主要介紹了mybatis模糊查詢、分頁和別名配置,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論