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

解析远程API中断的json

陈胤
2023-03-14
  {
    "id": 33,
    "is_local": "true",
    "comments":
         [
          { "url": "aaa" },

          { "url": "bbb" },

          { "url": "ccc" )

     ]

}

我正在使用这个自定义适配器来返回默认值,以防出现解析错误,就像我的例子中的is is_local字段一样

class DefaultOnDataMismatchAdapter<T> private constructor(private val delegate: 
   JsonAdapter<T>, private val defaultValue: T?) : JsonAdapter<T>() {

 @Throws(IOException::class)
  override fun fromJson(reader: JsonReader): T? =
        try {
            delegate.fromJsonValue(reader.readJsonValue())
        } catch (e: Exception) {
            println("Wrongful content - could not parse delegate " + 
delegate.toString())
            defaultValue
        }

@Throws(IOException::class)
override fun toJson(writer: JsonWriter, value: T?) {
    delegate.toJson(writer, value)
}

  companion object {
    @JvmStatic
    fun <T> newFactory(type: Class<T>, defaultValue: T?): 
    JsonAdapter.Factory {
        return object : JsonAdapter.Factory {
            override fun create(requestedType: Type, annotations: 
      Set<Annotation>, moshi: Moshi): JsonAdapter<*>? {
                if (type != requestedType) {
                    return null
                }
                val delegate = moshi.nextAdapter<T>(this, type, 
          annotations)
                return DefaultOnDataMismatchAdapter(delegate, 
     defaultValue)
             }

         }
      }
   }

}

我的测试失败,布尔值不是false,我已经将上面的适配器添加到moshi中

@Before
fun createService() {

    val moshi = Moshi.Builder()


    .add(DefaultOnDataMismatchAdapter
                           .newFactory(Boolean::class.java,false))
            .add(KotlinJsonAdapterFactory())
            .build()

    val retrofit = Retrofit.Builder()
            .baseUrl(mockWebServer.url("/"))
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .build()

    service =  retrofit.create(ApiStores::class.java)



}




@Test
fun getBooleanParsingError() {

    enqueueResponse(case1)

    val article = service.getArticle().execute()

    assert(article.body()!!).isNotNull()
    assert(article.body()!!.is_local).isEqualTo(false)  // test fail here 

}

但是,当我将模型类中is_local字段的datatype更改为not nullable时,它就可以工作了

共有1个答案

楚昀
2023-03-14

问题在于类型kotlin.booleankotlin.boolean?对应于两种不同的Java类型:

  • kotlin.booleanbooleanJava基元类型
  • kotlin.boolean?Java.lang.booleanJava类型

在测试中,您为kotlin.boolean(即Javaboolean类型)创建了一个适配器,而在数据模型中,您有一个kotlin.boolean?(即Java.lang.boolean类型)。因此,当调用工厂方法create(...)时,您所处的情况是type!=requestedtype,因此没有创建适配器,而是使用KotlinJsonAdapter。此时,由于Json的is_local字段不是布尔值(而是字符串),Moshi应该引发异常。

 类似资料:
  • 我正试图通过MoneySend API在万事达卡的沙箱上提出付款请求。下面是C#的示例代码,也可以在这里找到 问题陈述: 完全异常: mastercard.core.exceptions.apiExceptions:无法解析远程名称:“sandbox.api.mastercard.com”-->system.net.webException:无法解析远程名称:“sandbox.api.master

  • 这样的问题已经问过好几次了,我明白为什么会发生,大概除了重试,我们对此无能为力。 我有一个关于名称解析的问题。 我使用的是3.5.NET的AWS.NET SDK。我正在上传一个大文件(>500MB到1.5GB,医学图像)。我调用方法。 错误发生在大约250MB上载完成后。 这是实际的例外

  • 我正在使用JBoss开关站连接到安全的远程SOAP web服务。在发送请求后出于某种原因;远程web服务正在停止任何进一步的通信;所以我没有收到回复。 我需要一个想法或解决方案,这可能是个问题。 原因:java。网SocketException:SocketException调用https://***********。asmx:来自服务器的文件意外结束 远程Web服务正在使用自签名证书;我已将服务

  • 本文向大家介绍浅谈Java线程Thread之interrupt中断解析,包括了浅谈Java线程Thread之interrupt中断解析的使用技巧和注意事项,需要的朋友参考一下 这一篇我们说说Java线程Thread的interrupt中断机制。 中断线程 线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或

  • 嗨,我对Jprofiler很陌生

  • 本文向大家介绍使用python远程操作linux过程解析,包括了使用python远程操作linux过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了使用python远程操作linux过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在云服务测试中,往往需要我们进入云服务内容进行相关内容的测试。这测试可以使用平台自身的noV