Program Tip

Kotlin에서 JSON을 파싱하는 방법은 무엇입니까?

programtip 2020. 10. 31. 09:59
반응형

Kotlin에서 JSON을 파싱하는 방법은 무엇입니까?


서비스에서 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")
}

외부 라이브러리 없음 (Android)

이것을 파싱하려면 :

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)

저는 개인적으로 여기에서 찾을 수있는 Kotlin 용 Jackson 모듈 jackson-module-kotlin을 사용 합니다.

implementation "com.fasterxml.jackson.module:jackson-module-kotlin:$version"

예를 들어, 다음은 상당히 무거운 Exile 스킬 트리 경로의 JSON을 구문 분석하는 코드입니다 (포맷시 84k 줄).

Kotlin 코드 :

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

귀하의 설명을 감안할 때 귀하의 요구와 일치한다고 생각합니다.


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에는 수업 초반에 추가해야 했습니다.


First of all.

You can use JSON to Kotlin Data class converter plugin in Android Studio for JSON mapping to POJO classes (kotlin data class). This plugin will annotate your Kotlin data class according to JSON.

Then you can use GSON converter to convert JSON to Kotlin.

Follow this Complete tutorial: Kotlin Android JSON Parsing Tutorial

If you want to parse json manually.

val **sampleJson** = """
  [
  {
   "userId": 1,
   "id": 1,
   "title": "sunt aut facere repellat provident occaecati excepturi optio 
    reprehenderit",
    "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita"
   }]
   """

Code to Parse above JSON Array and its object at index 0.

var jsonArray = JSONArray(sampleJson)
for (jsonIndex in 0..(jsonArray.length() - 1)) {
Log.d("JSON", jsonArray.getJSONObject(jsonIndex).getString("title"))
}

http://www.jsonschema2pojo.org/ Hi you can use this website to convert json to pojo.
control+Alt+shift+k

After that you can manualy convert that model class to kotlin model class. with the help of above shortcut.


A bit late, but whatever.

Kotlin 의미 체계를 사용하는 구문과 같이 JavaScript보다 JSON을 구문 분석하는 것을 선호하는 경우 필자가 저자 인 JSONKraken을 권장 합니다.

이 문제에 대한 제안과 의견이 많이 평가됩니다!


여기에서 deme의 소스를 다운로드하십시오 ( Android kotlin에서 Json 구문 분석 )

이 종속성을 추가하십시오.

compile 'com.squareup.okhttp3:okhttp:3.8.1'

API 함수 호출 :

 fun run(url: String) {
    dialog.show()
    val request = Request.Builder()
            .url(url)
            .build()

    client.newCall(request).enqueue(object : Callback {
        override fun onFailure(call: Call, e: IOException) {
            dialog.dismiss()

        }

        override fun onResponse(call: Call, response: Response) {
            var str_response = response.body()!!.string()
            val json_contact:JSONObject = JSONObject(str_response)

            var jsonarray_contacts:JSONArray= json_contact.getJSONArray("contacts")

            var i:Int = 0
            var size:Int = jsonarray_contacts.length()

            al_details= ArrayList();

            for (i in 0.. size-1) {
                var json_objectdetail:JSONObject=jsonarray_contacts.getJSONObject(i)


                var model:Model= Model();
                model.id=json_objectdetail.getString("id")
                model.name=json_objectdetail.getString("name")
                model.email=json_objectdetail.getString("email")
                model.address=json_objectdetail.getString("address")
                model.gender=json_objectdetail.getString("gender")

                al_details.add(model)


            }

            runOnUiThread {
                //stuff that updates ui
                val obj_adapter : CustomAdapter
                obj_adapter = CustomAdapter(applicationContext,al_details)
                lv_details.adapter=obj_adapter
            }

            dialog.dismiss()

        }

    })

참고 URL : https://stackoverflow.com/questions/41928803/how-to-parse-json-in-kotlin

반응형