【问题标题】:Map JSON String to JsonObject将 JSON 字符串映射到 JsonObject
【发布时间】:2018-12-27 11:53:12
【问题描述】:

我有一个类似的 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;

【问题讨论】:

    标签: scala gson objectmapper


    【解决方案1】:

    我会使用 com.fasterxml.jackson.databind.JsonNode 而不是使用 Google 的 Gson JsonObject 类。使用杰克逊自己的课程应该很简单。 尽管您可能只是映射到 Map[String, Any] 来获得这种灵活性,除非您确实需要它仍然在 Json 中。

    【讨论】:

    • 感谢塞巴斯蒂安。我只是简化了 JSON 格式来简单地呈现问题。它更多的是嵌套形式,我需要同样的课程。改成 JsonNode 解决了我的问题。
    • @user811602 是的,Google 的 Gson 类也可能代表 json,但不是以 Jackson 神奇理解的方式。我相信你可以制作一些有效的映射,但会更难。
    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2012-01-23
    • 2018-05-29
    • 1970-01-01
    相关资源
    最近更新 更多