猛禽洛的程式筆記庫

[Kotlin] 在maven專案中使用序列化(serialization)解析JSON

最近開了新的kotlin maven專案後,發現與gson有相容性問題,不像android中可以直接使用,試了幾種方式後,決定使用kotlin所提供的Serialization JSON方法。

1.到pom.xml中指定properties serialization.version版本、新增repository來源、新增kotlinx-serialization-json kotlinx-serialization-core kotlin-serialization-compiler-plugin模組,須注意kotlin.versionserialization.version會有相容性上的問題,必須要互相搭配:

<properties>
  <kotlin.version>2.0.0</kotlin.version>
  <serialization.version>1.8.0</serialization.version>
</properties>

<repositories>>
  <repository>
    <id>kotlinx</id>
    <url>https://kotlin.bintray.com/kotlinx</url>
  </repository>
</repositories>
  
<dependencies>
  <dependency>
    <groupId>org.jetbrains.kotlinx</groupId>
    <artifactId>kotlinx-serialization-core-jvm</artifactId>
    <version>${serialization.version}</version>
  </dependency>
  <dependency>
    <groupId>org.jetbrains.kotlinx</groupId>
    <artifactId>kotlinx-serialization-json-jvm</artifactId>
    <version>${serialization.version}</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-serialization-compiler-plugin -->
  <dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-serialization-compiler-plugin</artifactId>
    <version>2.0.21</version>
  </dependency>
</dependencies>

 

2.序列化的檔案必須要編譯過才能使用,所以下方的plugin也要加入kotlinx-serialization

<build>
    <plugins>
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <compilerPlugins>
                    <plugin>kotlinx-serialization</plugin>
                </compilerPlugins>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.jetbrains.kotlin</groupId>
                    <artifactId>kotlin-maven-serialization</artifactId>
                    <version>${kotlin.version}</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

 

3.在module-info.java加入requires

requires kotlinx.serialization.core;
requires kotlinx.serialization.json;

 

4.建立data class檔案,裡面放json的格式

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class RawdataAi(
    @SerialName("DeviceId") val deviceId: String,
    @SerialName("ThermalArray") val thermalArray: List<Float>
)

@Serializable一定要標記,系統才認得出來

@SerialName("DeviceId")可以自訂JSON Key名稱所對應的變數名稱,方便處理JSON來的欄位名稱規則會與kotlin不一致的問題

 

5.由字串解析(反序列化)

val json = """{
  "GatewayId": "G001",
  "ThermalArray": [
    100.1,
    111.6,
    180.2,
    222.5
  ]
}"""

val myData = Json.decodeFromString<RawdataAi>(json)
println(myData)

 

6.由data class物件轉回JSON字串(序列化)

val jsonString = Json.encodeToString(myData)
println(jsonString)

 

-END-

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *