Scala: ObjectMapper не может сопоставить JSON с классом-членом - PullRequest
0 голосов
/ 16 октября 2018

У меня есть файл json с содержимым:

{
  "ruleName": "rule1",
  "steps": [{
    "stepIdentifer": "SI1"
  }, {
    "stepIdentifer": "SI2"
  }]
}

Я пытаюсь сопоставить его с классом scala (Правило), используя следующий код:

import java.io.FileInputStream
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper}
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.google.gson.GsonBuilder

def main(args: Array[String]): Unit = {
    val file:String = "<file_path>";    
    val stream = new FileInputStream(file)
    val mapper = new ObjectMapper with ScalaObjectMapper
    mapper.registerModule(DefaultScalaModule)
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    val rule: Rule = mapper.readValue[Rule](stream)    
    val gson = new GsonBuilder().setPrettyPrinting().create()
    println(gson.toJson(rule)) // PRINT_STATEMENT
  }

Вывод из оператора print:

{
  "ruleName": "rule1",
  "steps": {}
}

Файл Json содержит "шаги", но в выходных данных он не сопоставлен с классом-членом RuleStep.

Определение класса Scala класса Rule выглядит следующим образом:

class Rule {
  var ruleName: String = null;
  var steps:List[RuleStep] = null;
}

Определение класса Scala класса RuleStep выглядит следующим образом:

class RuleStep {
  var stepIdentifer: String = null
}

Я не могу понять, что я пропустил?Что я должен сделать, чтобы сопоставить класс члена (RuleStep) с вложенным Json (ключ атрибута: "steps")?

Версии:

Scala = 2.11
libraryDependencies += "com.google.code.gson" % "gson" % "2.6.2"
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.6.2"
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-core" % "2.6.2"

1 Ответ

0 голосов
/ 16 октября 2018

Возможно, Gson не работает с классами Scala должным образом.Возникла похожая проблема .Но mapper.writeValueAsString(rule) работает хорошо и возвращает:

{"ruleName":"rule1","steps":[{"stepIdentifer":"SI1"},{"stepIdentifer":"SI2"}]}

Также вы можете использовать другие библиотеки JSON, которые удобнее использовать, такие как spray-json или даже circe основанный на функциональной парадигме

...