2014-04-17 4 views
0

мне нужно разобрать следующий JSON строки:JsonProperty аннотации не работает Json разбор в Scala (Jackson/Jerkson)

{"type": 1}

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

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]. 

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

ответ

3

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

case class MyJsonObj(
    val `type`: Int 
) 
+0

Хотя это будет работать , Я действительно искал причину, по которой аннотация @JsonProperty не работала должным образом. Кроме того, я хочу, чтобы имя val было более значимым, чем просто «тип». – gjain

+0

Это может быть проблемой, когда Scala делает все поля частными и автоматически генерирует методы получения и настройки. Возможно, вы сможете использовать мета-аннотации Scala (http://www.scala-lang.org/api/current/index.html#scala.annotation.meta.package). Что произойдет, если вы замените '@JsonProperty (" type ")' на '@ (JsonProperty (" type ") @field @getter @setter)'? – wingedsubmariner

1

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

Смежные вопросы