【问题标题】:Scala jackson deserialize斯卡拉杰克逊反序列化
【发布时间】:2021-01-25 10:47:29
【问题描述】:

我想在scala中用jackson反序列化json

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonCreator; 



case class Metadata(@JsonProperty("hive_type_string") hive_type_string: String)

case class Field(@JsonProperty("name") name: String, @JsonProperty("type") typeField: String, @JsonProperty("nullable") nullable: Boolean, @JsonProperty("metadata") metadata: Metadata) 

case class StructTable(@JsonProperty("type") typeField: String, @JsonProperty("fields") fields: Seq[Field])


val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
val struct = mapper.readValue[StructTable](json_struct)

json_struct:

{ “类型”:“结构”, “领域”:[ { “名称”:“代码角色”, “类型”:“字符串”, “可空”:真, “元数据”:{ "HIVE_TYPE_STRING":"字符串" } }, { "name":"libelle_role", “类型”:“字符串”, “可空”:真, “元数据”:{ "HIVE_TYPE_STRING":"字符串" } } ] }

这是错误:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造StructTable的实例:像这样的非静态内部类只能通过使用默认的无参数构造函数进行实例化

有人可以帮我吗?

谢谢。

【问题讨论】:

  • 您需要发布实际失败的代码,而不仅仅是 sn-ps,并尝试将其缩减为显示问题的最简单版本。
  • 您真的需要使用基于运行时反射的 Java 库吗?取而代之的是,在编译时派生解码器的许多 Scala 库中的任何一个更安全、更快?
  • @Tim 是实际代码,错误与最后一行有关:val struct = mapper.readValue[StructTable](json_struct)
  • 你有什么简单易用的东西@LuisMiguelMejíaSuárez 吗?
  • 几个选项:circeuJsonjsonitter-scala

标签: json scala jackson


【解决方案1】:

如果您可以选择另一个库,例如 jsoniter-scala,然后添加到您的依赖项中:

libraryDependencies ++= Seq(
  // Use the %%% operator instead of %% for Scala.js  
  "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core"   % "2.6.2",
  // Use the "provided" scope instead when the "compile-internal" scope is not supported in your build tool
  "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.6.2" % "compile-internal"
)

这里是一个代码 sn-p 来解析你的输入并打印解析的数据:

import com.github.plokhotnyuk.jsoniter_scala.macros._
import com.github.plokhotnyuk.jsoniter_scala.core._

case class Metadata(@named("HIVE_TYPE_STRING") hive_type_string: String)

case class Field(name: String, @named("type") typeField: String, nullable: Boolean, metadata: Metadata)

case class StructTable(@named("type") typeField: String, fields: Seq[Field])

implicit val codec: JsonValueCodec[StructTable] = JsonCodecMaker.make

val json_struct = """{ "type":"struct", "fields":[ { "name":"code_role", "type":"string", "nullable":true, "metadata":{ "HIVE_TYPE_STRING":"string" } }, { "name":"libelle_role", "type":"string", "nullable":true, "metadata":{ "HIVE_TYPE_STRING":"string" } } ] }""";
val struct = readFromString(json_struct)

println(struct)

预期的输出是:

StructTable(struct,List(Field(code_role,string,true,Metadata(string)), Field(libelle_role,string,true,Metadata(string))))

您也可以使用 Scastie here 在线运行它。

【讨论】:

  • 谢谢,去看看。
猜你喜欢
  • 1970-01-01
  • 2013-05-18
  • 2015-04-07
  • 1970-01-01
  • 2012-11-19
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多