Kotlin http4k: как получить поле json из тела ответа?

Ниже показан текст ответа http4k JavaHttpClient: '{"Hash":"QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH","Size":0,"CumulativeSize":6,"Blocks"}: "Тип": 0, "Тип блоков":

Какой модуль Kotlin можно использовать для извлечения значений полей "Хеш", "Размер", "Блоки" "Тип"?

2 ответа

Вам нужно добавить один из поддерживаемых модулей JSON :

      // Argo:  
implementation group: "org.http4k", name: "http4k-format-argo", version: "4.33.1.0"

// Gson:  
implementation group: "org.http4k", name: "http4k-format-gson", version: "4.33.1.0"

// Jackson: 
implementation group: "org.http4k", name: "http4k-format-jackson", version: "4.33.1.0"

// Klaxon: 
implementation group: "org.http4k", name: "http4k-format-klaxon", version: "4.33.1.0"

// Moshi: 
implementation group: "org.http4k", name: "http4k-format-moshi", version: "4.33.1.0"

// KotlinX Serialization: 
implementation group: "org.http4k", name: "http4k-format-kotlinx-serialization", version: "4.33.1.0"

Затем вы можете извлечь поля аналогичным образом:

      import org.http4k.core.Response
import org.http4k.core.Status
import org.http4k.format.Jackson.asJsonObject

val body = """
{"Hash":"QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH","Size":0,"CumulativeSize":6,"Blocks":0,"Type":"file"}
""".trimIndent()

val response = Response(Status.OK).body(body)

response.bodyString().asJsonObject().let {
    require(it.get("Hash").textValue() == "QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH")
    require(it.get("Size").intValue() == 0)
    require(it.get("CumulativeSize").intValue() == 6)
    require(it.get("Blocks").intValue() == 0)
    require(it.get("Type").textValue() == "file")

    println(it.get("Hash").textValue())
}

Некоторая документация доступна здесь: https://www.http4k.org/api/org.http4k.format/-json/

Используйте клаксон

build.gradle.kts:

   implementation("com.beust:klaxon:5.0.1")

модуль котлина:

   import com.beust.klaxon.Klaxon
   data class MyData(val name: String)

   val result = Klaxon().parse<MyData>("""
       { "name": "John Doe",} 
   """)
  val name = result?.name

дает "Джон Доу"

Другие вопросы по тегам