Аннотация JsonProperty не работает для анализа Json в Scala (Джексон / Джексон)

Мне нужно проанализировать следующую строку JSON:

{"Тип 1}

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

case class MyJsonObj(
    val type: Int
)

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

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

Однако анализатор Json по-прежнему отказывается искать строку "type" в 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].

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

2 ответа

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

case class MyJsonObj(
    val `type`: Int
)

Как подразумевает @wingedsubmariner, ответ заключается в метааннотациях Scala.

Это сработало для меня:

import scala.annotation.meta.field

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

Это в дополнение к mapper.registerModule(DefaultScalaModule), который вам, вероятно, понадобится при десериализации в класс Scala.

Я подозреваю, что вы не включаете поддержку 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

Другие вопросы по тегам