서비스에서 JSON 개체로 구문 분석 한 다음 클래스에 매핑해야하는 매우 깊은 JSON 개체 문자열을 받았습니다.
Kotlin에서 JSON 문자열을 객체로 변환하려면 어떻게해야하나요?
그 후 각 클래스에 매핑 한 후 Jackson의 StdDeserializer를 사용했습니다. 문제는 객체에 클래스로 역 직렬화되어야하는 속성이있는 순간에 발생합니다. 나는 객체 매퍼를 얻을 수 없었습니다. 적어도 다른 deserializer 내부에서 방법을 몰랐습니다.
도움을 주셔서 미리 감사드립니다. 가급적이면 기본적으로 필요한 종속성 수를 줄이려고 노력하고 있으므로 대답이 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)
답변
당신이 사용할 수있는 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)
답변
이것이 필요한 것인지 확실하지 않지만 이것이 내가 한 방법입니다.
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의 샘플입니다.
{ “음식”: [{ “FoodName”: “사과”, “무게”: “110”}]}
답변
저는 개인적으로 jackson-module-kotlin에서 찾을 수있는 Kotlin 용 Jackson 모듈을 사용합니다 .
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
에는 수업 초반에 추가해야 했습니다.