JSON ответ как карта - PullRequest
0 голосов
/ 04 января 2019

Я не могу получить ответ json как объект карты.

import com.google.gson.*
import org.jsoup.*
import com.google.gson.JsonPrimitive
import com.google.gson.JsonElement
// 1 count=10 at response
fun getFilms(count: Int = 1): Unit {
    var n: Int = 0
    val builder: GsonBuilder = GsonBuilder()
    val gson = builder.create()
    while(n <= count) {
        val doc: Document = Jsoup.connect("https://www.lostfilm.tv/ajaxik.php?act=serial&type=search&o=${n*10}&s=3&t=0").get()
        val data = doc.body().text().trimIndent()
        val prData: JsonObject = JsonParser().parse(data).getAsJsonObject()
        n++
        println(prData["data"].toString().replace("[", "").replace("]", ""))
    }
}

используя эту зависимость

   <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.8.3</version>
        </dependency>

Я хочу извлечь ответ JSON как Map, но я не могу этого сделать, я не знаю, как это сделать, данные будут извлечены с ключом значения.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Простой вариант - если это возможно - создать класс DTO и позволить Gson выполнить эту работу.Просмотр ответа в вашем URL DTO может выглядеть так:

data class Response(
    val data: Array<Map<String, String>>, // There is an array named 'data'
                                          // having name/value pair maps.
    val letters: Map<Int, Boolean>,       // This can also be a map.
    val result: String
)

Тогда вместо использования JsonParser используйте Gson экземпляр.Смотрите пример функции ниже:

@Test
fun test() {
    // Setted n = 1 in the url fir this test
    val url =
        "https://www.lostfilm.tv/ajaxik.php?act=serial&type=search&o=${1*10}&s=3&t=0"
    val doc: Document = Jsoup.connect(url).get()
    // Pretty print just in case you want ot print out also
    val gson = GsonBuilder().setPrettyPrinting().create();
    val res = gson.fromJson(doc.body().text(), Response::class.java)
    // Print out the first data item's value with key "title"
    log.info(res.data[0].get("title"))
}

Это должно напечатать что-то вроде (при условии, что данные не изменяются):

Наследие

Кажется, чтофактические данные фиксированы, поэтому вы можете создать DTO для этого, но это зависит от того, предпочтительнее ли это / нужно или более удобно.

0 голосов
/ 04 января 2019
import com.google.gson.*
import org.jsoup.*
import com.google.gson.JsonElement
import com.google.gson.JsonObject


fun getFilms(count: Int = 1): HashMap<Int, JsonObject> {
    var n: Int = 0
    val builder: GsonBuilder = GsonBuilder()
    val gson = builder.create()
    val ans = hashMapOf<Int, JsonObject>()
    while (n <= count) {
        val doc = Jsoup.connect("https://www.lostfilm.tv/ajaxik.php?act=serial&type=search&o=${n * 10}&s=3&t=0").get()
        val data = doc.body().text().trimIndent()
        val prData = JsonParser().parse(data).getAsJsonObject()
        ans.put(n, prData)
        n++
//        println(prData["data"].toString().replace("[", "").replace("]", ""))
    }
    return ans
}

fun main(args: Array<String>) {

    val films = getFilms(2)
    films.forEach { (key, value) ->
        var data = value.get("data").asJsonArray
        data.forEach {
            val obj = it.asJsonObject //since you know it's a JsonObject
            val entries = obj.entrySet()
            entries.forEach {
                println("${it.key},${it.value}") //her is your key value 

            }
        }
    }
}

пример вывода:

rating,7.7
title,"Страна приливов"
title_orig,"Tidelands"
date,"2018"
link,"/series/Tidelands"
alias,"Tidelands"
not_favorited,true
id,"399"
has_icon,"1"
has_image,true
img,"//static.lostfilm.tv/Images/399/Posters/image.jpg"
genres,"Криминал, Драма, Мистика"
channels,"Netflix"
status,7
status_7,true
status_auto,2
status_auto_2,true
status_season,"1"
rating,8.2
title,"Летящие сквозь ночь"
title_orig,"Nightflyers"
date,"2018"
link,"/series/Nightflyers"
alias,"Nightflyers"
not_favorited,true
id,"398"
has_icon,"1"
has_image,true
img,"//static.lostfilm.tv/Images/398/Posters/image.jpg"
genres,"Ужасы, Драма, Фантастика"
channels,"Syfy"
status,7
status_7,true
status_auto,1
status_auto_1,true
status_season,"1"
rating,8.9
title,"Побег из Даннеморы"
title_orig,"Escape at Dannemora"
date,"2018"
link,"/series/Escape_at_Dannemora"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...