【问题标题】:Parsing Json in scala with extending java class通过扩展java类在scala中解析Json
【发布时间】:2020-09-11 08:04:16
【问题描述】:

我有一个java类如下

public class JobConfig implements Serializable {
private String appName;
//some other params
public JobConfig() {
}
// getters setters 

我正在尝试在 scala 中扩展上述 java 类

class CsvJobConfig extends JobConfig(){
var delimiter =null
//other attributes

现在在主类中我试图解析一个 json 并将其分配回 CsvJobConfig 。

val is = fileReader.getInputStreamFor(configFileName, configPath, spark)
var jobConfigJson = IOUtils.toString(is, Charset.defaultCharset.name)
val mapper = new ObjectMapper
val config = mapper.readValue(jobConfigJson, classOf[CsvJobConfig]).asInstanceOf[CsvJobConfig]

下面是我试图解析的示例 json

{
"appName":"abc",
"delimiter": "\\|\\|"
}

虽然从 java 尝试它工作正常,但它在 scala 中给了我以下错误

    Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "delimiter" (class CsvJobConfig), not marked as ignorable (1 known properties:  ["appName"])
 "[truncated 405 chars]; line: 29, column: 17] (through reference chain: CsvJobConfig["delimiter"])
    at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:52)
    at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:839)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1045)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1352)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1330)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:264)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:125)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3736)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2726)
    at com.mastercard.dw.etl.spark.FlatFileProcessor$.delayedEndpoint$com$mastercard$dw$etl$spark$FlatFileProcessor$1(FlatFileProcessor.scala:30)
    at com.mastercard.dw.etl.spark.FlatFileProcessor$delayedInit$body.apply(FlatFileProcessor.scala:11)
    at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
    at scala.App$$anonfun$main$1.apply(App.scala:76)
    at scala.App$$anonfun$main$1.apply(App.scala:76)
    at scala.collection.immutable.List.foreach(List.scala:392)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
    at scala.App$class.main(App.scala:76)

【问题讨论】:

  • 为什么不使用 Scala 库,例如 circeuJsonplay-json , ETC?这也将允许您使用惯用代码,例如使用不可变案例类而不是不必要的 vars
  • 我一定会尝试,任何指针将不胜感激
  • 不确定您要查找哪些指针?

标签: scala fasterxml


【解决方案1】:

ObjectMapper 必须配置为不 FAIL_ON_UNKNOWN_PROPERTIES 参考下面的代码,并在 scala 类中分配变量的类型。

class CsvJobConfig extends JobConfig {
  var delimiter: String = null
}

import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper}
import com.fasterxml.jackson.module.scala.DefaultScalaModule
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
val config: CsvJobConfig = mapper.readValue("{\"appName\":\"abc\", \"delimiter\": \"\\\\|\\\\|\"}", classOf[CsvJobConfig])
println(config)
println(config.delimiter)

【讨论】:

  • 谢谢,我添加了 setter 方法,它不再是 unknownproperties。它起作用了
  • 当然,如果它有效,也许你可以接受答案。 :)
  • 添加 mapper.registerModule(DefaultScalaModule) 并有一个案例类工作
【解决方案2】:

值得一试

var delimiter: String = null

在你的代码中,变量分隔符的类型是Null类型,可能会导致这个异常。

【讨论】:

    【解决方案3】:

    添加 mapper.registerModule(DefaultScalaModule) 并且有一个案例类解决了这个问题。 在 scala 类中手动添加 setter 方法也可以解决问题。

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多