web-dev-qa-db-ja.com

KotlinでJSONを解析する方法?

私はサービスから非常に深いJSONオブジェクトの文字列を受け取り、それをJSONオブジェクトに解析し、それをクラスにマッピングしなければなりません。

KotlinでJSON文字列をオブジェクトに変換する方法

それぞれのクラスへのマッピングの後、私はJacksonのStdDeserializerを使っていました。この問題は、オブジェクトがクラスに逆シリアル化されなければならないプロパティを持っている瞬間に起こります。私はオブジェクトマッパーを取得することができませんでした、少なくとも私は方法を知りませんでした、別のデシリアライザの中で。

ご協力ありがとうございます。できれば、ネイティブに、私が必要とする依存関係の数を減らそうとしているのであれば、答えがJSON操作のみであり、それを解析すれば十分であると思えば。

54
AJ_1310

このライブラリを使うことができます https://github.com/cbeust/klaxon

KlaxonはKotlinでJSONを解析するための軽量ライブラリです。

33
Jason Bourne

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")
}
40

外部図書館なし

これを解析するには:

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)
17
frouo

これがあなたが必要とするものであるかどうかわからないが、これは私がそれをした方法です。

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"}}

15
markB

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)
13
KeLiuyue

私は個人的にあなたがここで見つけることができるコトリンのためのジャクソンモジュールを使います: 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

あなたの説明を考えると、私はそれがあなたのニーズに合っていると思います。

9
Neurf

まず第一に。

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"))
}
3
Hammad Tariq

JSONをKotlinに変換するには http://www.json2kotlin.com/ を使用してください。

Android Studioプラグインも使えます。 「ファイル」>「設定」を選択し、左側のツリーでPluginsを選択し、「リポジトリーの参照...」を押して「JsonToKotlinClass」を検索し、選択して緑色のボタン「インストール」をクリックします。

plugin

ASの再起動後に使用できます。 File > New > JSON To Kotlin Class (JsonToKotlinClass)を使ってクラスを作成できます。別の方法はAlt + Kを押すことです。

enter image description here

JSONを貼り付けるためのダイアログが表示されます。

2018年に私はクラスの始めにpackage com.my.package_nameを追加しなければなりませんでした。

2
CoolMind

http://www.jsonschema2pojo.org/ こんにちは、このWebサイトを使用してjsonをpojoに変換できます。
Ctrl + Alt + Shift + K

その後、そのモデルクラスを手動でkotlinモデルクラスに変換できます。上記のショートカットの助けを借りて。

1
kundan kamal