Kotlin 是一門對 JSON 友好的語言
簡評:moshi-kotlin 模塊的作者親自操刀教你如何使用 moshi 來完成 Kotlin 的 data 類與 JSON 格式之間的相互轉化。
我很喜歡 JSON,儘管它有一些小瑕疵,但它可讀性高,解析快,而且更簡單。這裡有個簡單的 GitHub 的消息的範例 API:
{ "url": "https://api.github.com/repos/square/okio/issues/156", "id": 91393390, "number": 156, "title": "ByteString CharSequence idea", "state": "open", "created_at": "2015-06-27T00:49:40.000Z", "body": "Lets make CharSequence thats backed by bytes.
"}
Kotlin 簡潔的不可變的 data 類可以很容易為這個 JSON 創建一個基本模型。
data class Issue( val url: String, val id: Long, val number: Long, val title: String, val state: String, val created_at: String, val body: String)
就是這樣。沒有 equals(), hashCode() 或 toString() 樣板。我們甚至不需要一個 builder!讓我們拓展一下這個模型,以便採用 Kotlin 默認值和顯式可空類型的優點:
data class Issue( val url: String, val id: Long, val number: Long, val title: String, val comments: Long = 0L, val created_at: String, val closed_at: String?, val body: String = "")
當從網路上解碼 JSON 時,默認值代替了空白。我喜歡這一點,這樣我就可以在測試用例中創建樣品數據的時候留下空值。顯式可空類型預防了潛在的數據問題。
今天我們發布了Moshi 1.5,通過 moshi-kotlin 模塊,提供強大的 Kotlin 支持。Moshi 的類型適配器和註解將 JSON 完美地綁定到數據模型。
data class Issue( val url: String, val id: Long, val number: Long, val title: String, val state: IssueState, val comments: Long = 0L, @Json(name = "created_at") val createdAt: Date, @Json(name = "closed_at") val closedAt: Date?, val body: String = "")
這個類使用正確的類型而不是字元串來解決問題的狀態和時間戳。@Json 註解將 Kotlin 的駝峰屬性名寫法映射為 JSON 的蛇形寫法。
轉成 JSON 我需要一個 Moshi.Builder 以及 JsonAdapter。我可以使用 Kotlin 的原始字元串在代碼中嵌入一個消息樣板。
val issueJson = """{ "url": "https://api.github.com/repos/square/okio/issues/156", "id": 91393390, "number": 156, "title": "ByteString CharSequence idea", "state": "open", "created_at": "2015-06-27T00:49:40.000Z"}"""val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe()) .build()val issueAdapter = moshi.adapter(Issue::class.java)val issue = issueAdapter.fromJson(issueJson)
如果你在使用 JSON,Moshi 和 Kotlin 幫助你使用更少的代碼來構建更好的模版。注意到 moshi-kotlin 使用 kotlin-reflect 來做屬性綁定。這個依賴比 Android 標準的(1.7 MiB / 11,500 個方法)要大。我們正在考慮解決這個問題!
原文地址:Kotlin』s a great language for JSON
擴展閱讀:
「Effective Java」 可能對 Kotlin 的設計造成了怎樣的影響——第一部分歡迎關註:
知乎專欄「極光日報」,每天為 Makers 導讀三篇優質英文文章。
推薦閱讀:
※用EBNFParser解析JSON和Xml
※豆瓣閱讀器通過 JSON 獲取文章內容,看到的數據格式是被混淆/加密的,這是通過什麼原理實現的?如何將其解碼?
※json是什麼?
※零拷貝讀取文件成go對象