【问题标题】:json response as Mapjson 响应作为地图
【发布时间】:2019-01-04 12:17:14
【问题描述】:

我无法将 json 响应作为 Map 对象。

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,但我不能这样做,我不知道这样做,数据将可以通过 value 的 key 提取。

【问题讨论】:

  • n++import org.jsoup.*
  • 你想要哪张地图?请描述输出键和值
  • Naor,JSON-object 看起来像 {"data": "title": "Example", "img": "img url" etc.},我想用 key 获得价值
  • while 循环中的每个 prData 都包含具有相同键的不同数据,因为所有响应都是相同的 json 格式! ,所以你不能首先将所有内容存储在一个地图中,你需要存储一个 [request id -> json] 的地图,然后解析每个 json 。现在我在第一张地图中再次询问您要使用什么作为您要使用的键 n 或响应标题?

标签: json parsing kotlin


【解决方案1】:

如果可能的话,简单的选择是创建一个 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,但这取决于具体情况是否更可取/需要或更方便。

【讨论】:

    【解决方案2】:
    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 2014-12-29
      • 2021-01-24
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多