最近開了新的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.version與serialization.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-
發佈留言