当前位置: 首页 > 知识库问答 >
问题:

使用不带自定义适配器的Moshi解析列表

轩辕瑞
2023-03-14

我使用一个API,它以数组的形式返回数据,比如这个JSON字符串(我们称之为“任务”)

[
  {"id": "5d9478a643a7520041b367c7",
   "name": "Task 1",
   "value": 2
  },
  {"id": "5d9478a243a7520041b367c6",
   "name": "Task 2",
   "value": 10
  },
]

我想将这个响应解析为一个列表。所以我已经用生成的适配器创建了相应的数据类

@JsonClass(generateAdapter = true)
data class Task(
    var id: String,
    var name: String,
    var value: Int
)

我的改装服务是这样的

private val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

private val retrofit = Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .baseUrl(BASE_URL)
    .build()

interface NetworkService {
    @GET("tasks")
    suspend fun tasks(): Response<List<Task>>
}

但我想使用容器类型,例如:

data class TaskList(val tasks: List<Task>)

作为网络响应结果。这可能不创建自定义adpter或者我将需要创建一个自定义适配器并将其传递给moshi构建器吗?

共有1个答案

宦翔飞
2023-03-14

您必须制作一个特定的适配器,以便解析像这样的JSON

class YourAdapter {

@FromJson
fun fromJson(reader: JsonReader, jsonAdapter: JsonAdapter<YourResponse>): List<YourResponse>? {
    val list = ArrayList<YourLResponse>()
    if (reader.hasNext()) {
        val token = reader.peek()
        if (token == JsonReader.Token.BEGIN_ARRAY) {
            reader.beginArray()
            while (reader.hasNext()) {
                val yourResponse = jsonAdapter.fromJsonValue(reader.readJsonValue())
                YoutResponse?.let {
                    list.add(yourResponse)
                }
            }
            reader.endArray()
        }
    }
    return list.toList()
}}
 类似资料:
  • 我在我的应用程序中使用了reverfit(V2.9.0)和Moshi(V1.11.0)。我尝试这样调用endpoint: 但是WatchStatus->JSON转换没有像预期的那样工作。WatchStatus是一个简单的枚举类: 我创建了一个自定义适配器,因为我的应用程序使用大写枚举名称,而后端使用小写名称: 我以以下方式创建Moshi实例: 并且我的改型实例使用它(带有Koin注入): 解析Js

  • 在为Android项目配置Kotlin之后,我编写了一个简单的。它调用了reverfit来获得一个包含以下数据的JSON文件: 现在我想使用Moshi将JSON数据转换为Kotlin的类,所以下面是反映上述JSON结构的两个类: 和Moshi的自定义类型适配器: 当它进入函数时,就像预期的那样。但奇怪的是,是,应该是。 我对莫希和科特林是新的,我已经在这个问题上坚持了大约10个小时。请帮帮我。谢谢

  • 我很难解析JSON的某些内部部分(使用Moshi),这些内部部分可能变化很大,并且高度非结构化。总体看来是: 和数据类结构如下所示: “DataItem”的模式变化很大。看起来Moshi codegen支持适配器,可能允许手动解析这些内部数据类,但我没有找到正确的教程或示例。理想情况下,我希望解析整个响应,就像解析一个定义良好的JSON一样。 以下是我如何使用改装/摩什 我如何实现这一点?任何示例

  • 我正在Android上使用Moshi 1.8.0,并按照Moshi文档中的说明创建自定义字段:https://github.com/square/Moshi#custom-field-names-with-json 这意味着我的请求数据类是这样的: 但问题是实际的HTTP请求是这样发送的: 我所期待的是我的请求是这样的: 这似乎对响应工作得很好,但我不知道如何使它对请求工作。 谢谢!这难道不是注释

  • 好了,我有了以下Json POJO: > 基于JProduct内部的某些值 JCategory two列表将合并为1,其中将包含更多的JCategory加上prod1/prod2。 根据Moshi的说法,这是映射适配器中数据的有效和高效的方法吗? 注意,我有一个JCategory,并且在同一个对象的列表中,所以我认为适配器会自动解析它,但它没有。所以我尝试了并成功了。 所以我的问题是: 是处理这种

  • 我是android开发的新手,我正在尝试创建一个自定义的适配器,为RecyclerView提供一个只包含一个图像和一个文本视图的视图。 但是,我试图为onBindViewHolder(VH,int)定义一个简单的扩展ViewHolder,而Android studio根本不会采用自定义ViewHolder,'MyViewHolder' - 说“该方法不会覆盖其超类中的方法。 如果我把参数变成一个普