私はサービスから非常に深いJSONオブジェクトの文字列を受け取り、それをJSONオブジェクトに解析し、それをクラスにマッピングしなければなりません。
KotlinでJSON文字列をオブジェクトに変換する方法
それぞれのクラスへのマッピングの後、私はJacksonのStdDeserializerを使っていました。この問題は、オブジェクトがクラスに逆シリアル化されなければならないプロパティを持っている瞬間に起こります。私はオブジェクトマッパーを取得することができませんでした、少なくとも私は方法を知りませんでした、別のデシリアライザの中で。
ご協力ありがとうございます。できれば、ネイティブに、私が必要とする依存関係の数を減らそうとしているのであれば、答えがJSON操作のみであり、それを解析すれば十分であると思えば。
このライブラリを使うことができます https://github.com/cbeust/klaxon
KlaxonはKotlinでJSONを解析するための軽量ライブラリです。
Kotlinでの構文解析の将来がkotlinx.serializationとなるのは間違いありません。これはKotlinライブラリの一部です。まだインキュベーター段階で書いている時点です。
https://github.com/Kotlin/kotlinx.serialization
import kotlinx.serialization.*
import kotlinx.serialization.json.JSON
@Serializable
data class MyModel(val a: Int, @Optional val b: String = "42")
fun main(args: Array<String>) {
// serializing objects
val jsonData = JSON.stringify(MyModel.serializer(), MyModel(42))
println(jsonData) // {"a": 42, "b": "42"}
// serializing lists
val jsonList = JSON.stringify(MyModel.serializer().list, listOf(MyModel(42)))
println(jsonList) // [{"a": 42, "b": "42"}]
// parsing data back
val obj = JSON.parse(MyModel.serializer(), """{"a":42}""")
println(obj) // MyModel(a=42, b="42")
}
これを解析するには:
val jsonString = """
{
"type":"Foo",
"data":[
{
"id":1,
"title":"Hello"
},
{
"id":2,
"title":"World"
}
]
}
"""
これらのクラスを使う:
import org.json.JSONObject
class Response(json: String) : JSONObject(json) {
val type: String? = this.optString("type")
val data = this.optJSONArray("data")
?.let { 0.until(it.length()).map { i -> it.optJSONObject(i) } } // returns an array of JSONObject
?.map { Foo(it.toString()) } // transforms each JSONObject of the array into Foo
}
class Foo(json: String) : JSONObject(json) {
val id = this.optInt("id")
val title: String? = this.optString("title")
}
使用法:
val foos = Response(jsonString)
これがあなたが必要とするものであるかどうかわからないが、これは私がそれをした方法です。
Import org.json.JSONObjectを使用します。
val jsonObj = JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1))
val foodJson = jsonObj.getJSONArray("Foods")
for (i in 0..foodJson!!.length() - 1) {
val categories = FoodCategoryObject()
val name = foodJson.getJSONObject(i).getString("FoodName")
categories.name = name
}
これがjsonのサンプルです。{"Foods":{"FoodName": "Apples"、 "Weight": "110"}}
Gson
を使うことができます。
ステップ1
コンパイルを追加
compile 'com.google.code.gson:gson:2.8.2'
ステップ2
JsonをKotlin Bean
に変換します( JsonToKotlinClass を使用)。
このような
Json
データ
{
"timestamp": "2018-02-13 15:45:45",
"code": "OK",
"message": "user info",
"path": "/user/info",
"data": {
"userId": 8,
"avatar": "/uploads/image/20180115/1516009286213053126.jpeg",
"nickname": "",
"gender": 0,
"birthday": 1525968000000,
"age": 0,
"province": "",
"city": "",
"district": "",
"workStatus": "Student",
"userType": 0
},
"errorDetail": null
}
Kotlin Bean
class MineUserEntity {
data class MineUserInfo(
val timestamp: String,
val code: String,
val message: String,
val path: String,
val data: Data,
val errorDetail: Any
)
data class Data(
val userId: Int,
val avatar: String,
val nickname: String,
val gender: Int,
val birthday: Long,
val age: Int,
val province: String,
val city: String,
val district: String,
val workStatus: String,
val userType: Int
)
}
ステップ3
Gson
を使う
var gson = Gson()
var mMineUserEntity = gson?.fromJson(response, MineUserEntity.MineUserInfo::class.Java)
私は個人的にあなたがここで見つけることができるコトリンのためのジャクソンモジュールを使います: jackson-module-kotlin 。
implementation "com.fasterxml.jackson.module:jackson-module-kotlin:$version"
例として、非常に重いPath of ExileスキルツリーのJSONを解析するためのコードを次に示します(フォーマット時に84k行)。
コトリンコード:
package util
import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.module.kotlin.*
import Java.io.File
data class SkillTreeData( val characterData: Map<String, CharacterData>, val groups: Map<String, Group>, val root: Root,
val nodes: List<Node>, val extraImages: Map<String, ExtraImage>, val min_x: Double,
val min_y: Double, val max_x: Double, val max_y: Double,
val assets: Map<String, Map<String, String>>, val constants: Constants, val imageRoot: String,
val skillSprites: SkillSprites, val imageZoomLevels: List<Int> )
data class CharacterData( val base_str: Int, val base_dex: Int, val base_int: Int )
data class Group( val x: Double, val y: Double, val oo: Map<String, Boolean>?, val n: List<Int> )
data class Root( val g: Int, val o: Int, val oidx: Int, val sa: Int, val da: Int, val ia: Int, val out: List<Int> )
data class Node( val id: Int, val icon: String, val ks: Boolean, val not: Boolean, val dn: String, val m: Boolean,
val isJewelSocket: Boolean, val isMultipleChoice: Boolean, val isMultipleChoiceOption: Boolean,
val passivePointsGranted: Int, val flavourText: List<String>?, val ascendancyName: String?,
val isAscendancyStart: Boolean?, val reminderText: List<String>?, val spc: List<Int>, val sd: List<String>,
val g: Int, val o: Int, val oidx: Int, val sa: Int, val da: Int, val ia: Int, val out: List<Int> )
data class ExtraImage( val x: Double, val y: Double, val image: String )
data class Constants( val classes: Map<String, Int>, val characterAttributes: Map<String, Int>,
val PSSCentreInnerRadius: Int )
data class SubSpriteCoords( val x: Int, val y: Int, val w: Int, val h: Int )
data class Sprite( val filename: String, val coords: Map<String, SubSpriteCoords> )
data class SkillSprites( val normalActive: List<Sprite>, val notableActive: List<Sprite>,
val keystoneActive: List<Sprite>, val normalInactive: List<Sprite>,
val notableInactive: List<Sprite>, val keystoneInactive: List<Sprite>,
val mastery: List<Sprite> )
private fun convert( jsonFile: File ) {
val mapper = jacksonObjectMapper()
mapper.configure( DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true )
val skillTreeData = mapper.readValue<SkillTreeData>( jsonFile )
println("Conversion finished !")
}
fun main( args : Array<String> ) {
val jsonFile: File = File( """rawSkilltree.json""" )
convert( jsonFile )
JSON(フォーマットされていない): http://filebin.ca/3B3reNQf3KXJ/rawSkilltree.json
あなたの説明を考えると、私はそれがあなたのニーズに合っていると思います。
まず第一に。
POJOクラス(kotlinデータクラス)へのJSONマッピングには、Android StudioのKotlin DataクラスコンバータプラグインへのJSONを使用できます。このプラグインは、JSONに従ってKotlinデータクラスに注釈を付けます。
その後、GSONコンバーターを使用してJSONをKotlinに変換できます。
この完全なチュートリアルに従ってください: Kotlin Android JSON構文解析チュートリアル
手動でJSONを解析したい場合。
val **sampleJson** = """
[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio
reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita"
}]
"""
インデックス0のJSON配列およびそのオブジェクトの上で解析するコード。
var jsonArray = JSONArray(sampleJson)
for (jsonIndex in 0..(jsonArray.length() - 1)) {
Log.d("JSON", jsonArray.getJSONObject(jsonIndex).getString("title"))
}
JSONをKotlinに変換するには http://www.json2kotlin.com/ を使用してください。
Android Studioプラグインも使えます。 「ファイル」>「設定」を選択し、左側のツリーでPlugins
を選択し、「リポジトリーの参照...」を押して「JsonToKotlinClass」を検索し、選択して緑色のボタン「インストール」をクリックします。
ASの再起動後に使用できます。 File > New > JSON To Kotlin Class (JsonToKotlinClass)
を使ってクラスを作成できます。別の方法はAlt + Kを押すことです。
JSONを貼り付けるためのダイアログが表示されます。
2018年に私はクラスの始めにpackage com.my.package_name
を追加しなければなりませんでした。
http://www.jsonschema2pojo.org/ こんにちは、このWebサイトを使用してjsonをpojoに変換できます。
Ctrl + Alt + Shift + K
その後、そのモデルクラスを手動でkotlinモデルクラスに変換できます。上記のショートカットの助けを借りて。