1

我收到具有以下结构的 JSON 响应:

[
    {
        "dateCreated": "07-22-2021",
        "comments": "Commenst",
        "url_list": "[{\"id\":1,\"name\":\"\",\"img\":\"https://legacynissan-ez360.imgix.net/1C3CDFEB6GD555251/1C3CDFEB6GD555251-2016-Dodge-Dart.sp_turntable_pic.1000.16x9-3840x2160-4K.20210721130782.jpg?w=300\",\"is_checked\":false,\"pois\":[]},{\"id\":2,\"name\":\"\",\"img\":\"https://legacynissan-ez360.imgix.net/1C3CDFEB6GD555251/1C3CDFEB6GD555251-2016-Dodge-Dart.sp_turntable_pic.1001.16x9-3840x2160-4K.20210721130782.jpg?w=300\",\"is_checked\":false,\"pois\":[]},{\"id\":3,\"name\":\"\",\"img\":\"https://legacynissan-ez360.imgix.net/1C3CDFEB6GD555251/1C3CDFEB6GD555251-2016-Dodge-Dart.sp_turntable_pic.1002.16x9-3840x2160-4K.20210721130782.jpg?w=300\",\"is_checked\":false,\"pois\":[]}]"

    } 
]

所以基本上我有一个对象列表(这个包含 dateCreated、comments 和 url_list)我的问题是 url_list 是一个保存为字符串的对象列表,我不知道如何将该字符串反序列化为一个对象。

1)这可能吗?2)怎么做?

我正在使用 Ktor 客户端和 kotlinx 序列化。

4

3 回答 3

1

我正在使用 Ktor 客户端和 kotlinx 序列化。

我也没用过。所以我用谷歌搜索了“kotlinx 自定义序列化”。这让我找到了 Kotlinx 序列化的 GitHub 页面上的文档。那个页面上有一个关于自定义序列化的巨大部分

基于此,您的答案是:

  1. 这可能吗?-> 是的,相当。

  2. 怎么做到呢?-> 编写一个自定义序列化程序 - 根据文档 - 将url_listJSON 字符串解析为类对象。

于 2021-12-10T04:31:08.310 回答
0

我最终创建了 3 个对象来对传入的数据进行建模。

响应数据的结构如下:

  1. 对象列表
  2. 每一个都包含一个嵌入在字符串中的对象列表
  3. 每一个都包含另一个对象列表。

我的三个对象与我现在得到的响应相匹配,通常我只需用 @serializable 标记所有内容并正确完成类,Kotlin 会处理其余的事情。

这次的问题是第二个对象嵌入在字符串中。

解决这个问题的方法是使用这个来解析它:

Json.decodeFromString<List<myObject>>(theStringIWantToParse)

这解决了问题,我可以获得所有数据,但是,这非常不方便,因为我不会将所有数据都放在一个数据结构中,而且我每次都必须手动解析它。

所以我把它和这个视频中的信息结合起来

这导致我创建另外 3 个对象,这些对象按照我想要的方式构建(我称它们为 Entity),而不是响应给我的方式,然后是 3 个映射器类来映射 3 个响应对象(我用 Dto 附加这些对象) 到我自己的 3 个对象(实体)

缺点:

  1. 更多代码(3 个实体和 3 个映射器类)

好处是:

  1. 我有一个清晰的层次,可以快速简单地适应响应结构上的机会。
  2. 它为我的代码库提供了更多的结构,因此它比随机解析更容易管理
于 2021-12-11T01:23:33.697 回答
0

您需要将 url_list 模拟为它自己的对象。您可能需要对其稍作修改。

@Serializable
data class YourJson(
        var dateCreated: String,
        var comments: String
        @SerializedName("url_list")
        var urlStuff : List<UrlStuff>
)
@Serializable
data class UrlStuff(
        var id: Int,
        var name: String,
        @SerializedName("img")
        var image: String,
        @SerializedName("is_checked")
        var isChecked: Boolean,
        var pois: List<String>
)
于 2021-12-10T04:01:41.610 回答