Аннотация 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