kotlin with fastjson parse object error: конструктор по умолчанию не найден - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь использовать объект синтаксического анализа fastjson в коде Kotlin.но исключение произошло, когда я использую JSON.parseObject, вот подробности:

Мой класс данных:

    import com.alibaba.fastjson.JSONObject

    data class StatesMessage @JvmOverloads constructor(val command: String = 
        "states", var states: States = States()) {

      fun toJsonString(): String {
          return JSONObject.toJSONString(this)
      }

      data class States(var x: Double = 0.0, var y: Double = 0.0)
    }

Затем я пытаюсь получить объект из строки:

val state = JSON.parseObject(s, StatesMessage::class.java)

Но исключение выдается от fastjson:

Caused by: com.alibaba.fastjson.JSONException: default constructor not found. 
    class com.example.demo.StatesMessage
   at com.alibaba.fastjson.util.JavaBeanInfo.build(JavaBeanInfo.java:475)
   at com.alibaba.fastjson.util.JavaBeanInfo.build(JavaBeanInfo.java:221)
   at com.alibaba.fastjson.parser.ParserConfig.createJavaBeanDeserializer(ParserConfig.java:670)
   at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:587)
   at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:398)
   at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:665)
   at com.alibaba.fastjson.JSON.parseObject(JSON.java:365)
   at com.alibaba.fastjson.JSON.parseObject(JSON.java:269)
   at com.alibaba.fastjson.JSON.parseObject(JSON.java:488)
   at com.example.demo.StartupRunner.run(StartupRunner.kt:25)
   at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:813)
... 5 more

весь код относится к https://github.com/forest-yang/koltinjson

1 Ответ

0 голосов
/ 31 декабря 2018

Я думаю, что это ошибка fastjson (до 1.2.54).Когда я перехожу на gson, это работает.

    /* it will throw exception
    val state = JSON.parseObject(s, StatesMessage::class.java)
    */
    val state = Gson().fromJson(s, StatesMessage::class.java)
    logger.info(state.states.x)
    logger.info(state.states.y)
...