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

objectmapper。readValue()失败,错误为“没有从字符串值反序列化的字符串参数构造函数/工厂方法”

慕容嘉熙
2023-03-14

我的objectmapper.readValue()函数抛出一个错误,显示“无法构造MyErrorMessage的实例(尽管至少存在一个Creator):没有String参数构造函数/工厂方法可以从String值反序列化。”

我的MyErrorMessage类有什么问题导致objectmapper失败?

这就是我试图解析的JSON。

{
  "meta": {
    "id": "43225a4853b5497a",
    "time": "2020-06-03T13:36:03.391814Z"
  },
  "datadetail": {
    "aKey": "hweriu-erw",
    "aTypes": [
      {
        "bKey": "ewrf-7e9f",
        "cKey": "12ddf3",
        "status": "ERROR",
        "errorMessage": {
          "message": "Not found"
        }
      }
    ],
    "status": "ONE",
    "errorMessage": "ERROR with aKey"
  }
}

这是函数和类。

private fun ParseResponse(responseMessage: String): MyResponse{
    try {
        val objectMapper = ObjectMapper()
        return objectmapper.readValue(message, MyResponse::class.java)
    }catch (e: JsonProcessingException) {
      throw IllegalArgumentException("json was invalid $responseMessage", e)
    }
}

data class MyResponse(
    val meta: Metainfo,
    val datadetail: DataResponse
)

data class MetaInfo(
    val id: String,
    val time: Instant
)

data class DataResponse(
    val aKey: MyKey,
    val aTypes: List<TypesResponse>,

    val aNumber: String? = null,
    val status: StatusType,
    val errorMessage: MyErrorMessage = null
)

enum class StatusType{
    OK,
    ERROR
}

data class TypesResponse(
    val bKey: MyBKey,
    val cKey: MyCKey,
    val status: StatusType,
    val errMessage: MyErrorMessage? = null
)

data class MyErrorMessage(
    @JsonProperty("message")
    val message: String,

    @JsonProperty("context")
    val context: MyContext?,
){
    constructor(message: String) : this(
        message = message,
        context = null
    )

    enum class MyContext{
        ONE, TWO, THREE
    }
}

共有1个答案

鲁单弓
2023-03-14

JSON不遵循类结构。您有“errorMessage”:“ERROR with aKey”,但您在数据响应中的错误消息实际上是一个MyErrorMessage,它是一个对象,而不是一个简单的字符串。

它需要是:

"errorMessage": {
  "message": "ERROR with aKey"
}

如果这不是一个选项,那么您需要一个定制的Jackson JSON反序列化器来处理您的MyErrorMessage。你可以在这里查一个例子。

 类似资料: