Аннотация JsonProperty не работает для анализа Json в Scala (Jackson/Jerkson)

Мне нужно разобрать следующую строку json:

{"Тип 1}

Класс case, который я использую, выглядит так:

case class MyJsonObj(
    val type: Int
)

Однако это сбивает с толку Scala, поскольку «тип» — это ключевое слово. Итак, я попытался использовать аннотацию @JsonProperty от Jacson/Jerkson следующим образом:

case class MyJsonObj(
    @JsonProperty("type") val myType: Int
)

Однако синтаксический анализатор Json по-прежнему отказывается искать строку «тип» в json вместо «myType». Следующий пример кода иллюстрирует проблему:

import com.codahale.jerkson.Json._
import org.codehaus.jackson.annotate._

case class MyJsonObj(
    @JsonProperty("type") val myType: Int
)

object SimpleExample {
  def main(args: Array[String]) {
    val jsonLine = """{"type":1}"""
    val JsonObj = parse[MyJsonObj](jsonLine)
}

Я получаю следующую ошибку:

[error] (run-main-a) com.codahale.jerkson.ParsingException: Invalid JSON. Needed [myType], but found [type].

P.S: Как видно выше, я использую джерксон/джексон, но не против переключиться на какую-нибудь другую библиотеку разбора json, если это облегчит жизнь.


person gjain    schedule 17.04.2014    source источник


Ответы (3)


Используйте обратные кавычки, чтобы компилятор Scala не интерпретировал тип как ключевое слово:

case class MyJsonObj(
    val `type`: Int
)
person wingedsubmariner    schedule 17.04.2014
comment
Хотя это сработает, я действительно ищу причину, по которой аннотация @JsonProperty не работает должным образом. Кроме того, я хочу, чтобы имя val было более значимым, чем просто «тип». - person gjain; 17.04.2014
comment
Это может быть проблемой из-за того, что Scala делает все поля закрытыми и автоматически создает методы получения и установки. Вы можете использовать метааннотации Scala< /а>. Что произойдет, если вы замените @JsonProperty("type") на @(JsonProperty("type") @field @getter @setter)? - person wingedsubmariner; 17.04.2014


Я подозреваю, что вы неправильно включаете поддержку Scala в Джексоне.

Я пробовал это:

object Test extends App {

  val mapper = new ObjectMapper
  mapper.registerModule(DefaultScalaModule)
  println(mapper.writeValueAsString(MyJsonObj(1)))

  val obj = mapper.readValue("""{"type":1}""", classOf[MyJsonObj])
  println(obj.myType)
}

case class MyJsonObj(@JsonProperty("type") myType: Int)

И я получаю:

{"type":1}
1

Обратите внимание, что я добавил поддержку Scala в средство сопоставления объектов, вызвав registerModule

person sksamuel    schedule 17.04.2014