使用gson将JSON字符串解析为Data类的Kotlin vert.x始终返回null

时间:2019-03-05 18:35:47

标签: kotlin gson vert.x

我只是在玩vert.x 3.5.3 Kotlin,无法使用gson将JSON字符串解析为Data类。

这是代码


class DataVerticle : AbstractVerticle() {
  override fun start(startFuture: Future<Void>) {

    data class Product(
      @SerializedName("id") val id: Int,
      @SerializedName("name") val name: String,
      @SerializedName("productCode") val productCode: String
    )

    val products: MutableList<Product> = mutableListOf()
    val gson = Gson()

    val eventBus = vertx.eventBus()
    eventBus.consumer<String>("data.verticle") {
      when (it.headers().get("ACTION")) {
        "ADD_PRODUCT" -> {
          val prodJson = it.body()
          if (prodJson != null) {
            println(prodJson)
            val product = gson.fromJson(prodJson, Product::class.java)
            println(product)
            it.reply("SUCCESS")
          }
        }

        else -> {
          print("ERROR")
        }
      }
    }
    startFuture.complete()
  }
}

问题是解析的值始终为null 这是我的示例json->

{"id":1,"name":"SOAP","productCode":"P101"}

通过eventBus发送的json字符串不为null。 我正在为gson使用此软件包 com.google.code.gson”,版本:“ 2.8.5”

谢谢

1 个答案:

答案 0 :(得分:1)

您在方法体内声明了您的类,Gson对此不太喜欢。

将其提取为嵌套类就可以了:

DataVerticle类:AbstractVerticle(){     覆盖有趣的开始(startFuture:未来){         val gson = Gson()

    val eventBus = vertx.eventBus()
    eventBus.consumer<String>("data.verticle") {
        when (it.headers().get("ACTION")) {
            "ADD_PRODUCT" -> {
                val prodJson = it.body()
                if (prodJson != null) {
                    println(prodJson)
                    val product = gson.fromJson(prodJson, Product::class.java)
                    println(product)
                    it.reply("SUCCESS")
                }
            }
            else -> {
                print("ERROR")
            }
        }
    }
    startFuture.complete()
}

data class Product(
    @SerializedName("id") val id: Int,
    @SerializedName("name") val name: String,
    @SerializedName("productCode") val productCode: String
)

}

经过测试:

val vertx = Vertx.vertx()

vertx.deployVerticle(DataVerticle()) {
    val options = DeliveryOptions()
    options.addHeader("ACTION", "ADD_PRODUCT")
    vertx.eventBus().send("data.verticle", """{"id":1,"name":"SOAP","productCode":"P101"}""", options)
}