Отобразить строку JSON в объект JsonObject - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть строка JSON, такая как

{
    "key1": "value1",
    "definition": {
     // JSON content here
    }
}

ключ «определения» в JSON может содержать JSONArray, JSONObject.Например, он может иметь

"key2" : ""

или

"key2" : {}

или

"key2" : []

Для этого я создал соответствующий класс Scala, например

import com.google.gson.JsonObject
class JsonData {
  var key1: String = _
  var definition: JsonObject = _
}

При отображении строки JSON в класс JsonData я получаю «определение» в экземпляре JsonData как пустое.

Пример кода:

import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper}
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.google.gson.JsonObject

object TestMe {

  val mapper = new ObjectMapper with ScalaObjectMapper
  mapper.registerModule(DefaultScalaModule)
  mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

  def main(args: Array[String]): Unit = {
    val jsonString = "{\"key1\": \"value1\",\"definition\": {\"key2\" : \"abc\"}}"
    val data = mapper.readValue[JsonData](jsonString)
    println(data.definition.getAsJsonObject()) //empty

    val jsonString1 = "{\"key1\": \"value1\",\"definition\": {\"key2\" : {\"key3\" : \"\"}}}"
    val data1 = mapper.readValue[JsonData](jsonString1)
    println(data1.definition.getAsJsonObject()) //empty

    val jsonString2 = "{\"key1\": \"value1\",\"definition\": {\"key2\" : [\"a\",\"b\"]}}"
    val data2 = mapper.readValue[JsonData](jsonString2)
    println(data2.definition.getAsJsonObject()) //empty
  }

  class JsonData {
    var key1: String = _
    var definition: JsonObject = _
  }
}

Как прочитать строку JSON исопоставить его с классом, который имеет один из типов атрибутов JsonObject?

Версии:

Scala : 2.11
Jackson-core = 2.6.x;
Gson = 2.6.x;
Jackson-databind = 2.6.x;
Jackson-module-scala = 2.6.5;

1 Ответ

0 голосов
/ 27 декабря 2018

Я бы использовал com.fasterxml.jackson.databind.JsonNode вместо класса Google Gson JsonObject.Использование собственных классов Джексона должно сделать это довольно тривиальным.Хотя вместо этого вы можете просто указать Map[String, Any] для такой гибкости, если только вам действительно не нужно оставаться в Json.

...