【问题标题】:Deserialize String inside JSON反序列化 JSON 中的字符串
【发布时间】:2022-01-14 20:05:31
【问题描述】:

我收到具有以下结构的 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、cmets 和 url_list)我的问题是 url_list 是保存为字符串的对象列表,我不知道如何将该字符串反序列化为对象。

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

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

【问题讨论】:

    标签: android kotlin ktor json-serialization ktor-client


    【解决方案1】:

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

    我也没用过。所以我用谷歌搜索了“kotlinx 自定义序列化”。这导致我使用 the documentation on the the GitHub page 进行 Kotlinx 序列化。在那个页面上有a huge section on custom serialization

    基于此,您的答案是:

    1. 这可能吗? -> 是的,完全可以。

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

    【讨论】:

    • 我认为这是一个可能的解决方案,但对于我来说,我无法弄清楚如何编写自定义序列化程序,所以我想出了一个不同的方法。谢谢。
    【解决方案2】:

    您需要将 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>
    )
    

    【讨论】:

    • 这行不通,因为 YourJson 类中的 urlStuff 嵌入在字符串中,所以你会得到这样的“UrlStuffObject”
    【解决方案3】:

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

    响应数据的结构如下:

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

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

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

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

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

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

    所以我将它与来自此 this 视频的信息结合起来

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

    缺点:

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

    好处是:

    1. 我有一个清晰的层次,可以快速简单地适应响应结构上的机会。
    2. 它为我的代码库提供了更多的结构,因此更容易 管理而不是到处随机解析

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2021-09-02
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多