В scala я пытаюсь преобразовать json обратно в класс case, но json иногда содержит пустую строку. В этих случаях он выбрасывает:
com.fasterxml.jackson.databind.JsonMappingException: Instantiation of [simple type, class Person] value failed: null
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.wrapException(StdValueInstantiator.java:399)
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromObjectWith(StdValueInstantiator.java:231)
at com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.build(PropertyBasedCreator.java:135)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:442)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1099)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:296)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:133)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3736)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2726)
at JacksonUtil$.fromJson(<console>:142)
... 58 elided
Caused by: java.lang.NullPointerException
... 66 more
Мой конвертер:
object JacksonUtil {
private var mapper = new ObjectMapper() with ScalaObjectMapper
intializeMapper( )
def intializeMapper() = {
// jackson library does not support seralization and deserialization of
// of scala classes like List and Map, this is needed to support it
mapper.registerModule( DefaultScalaModule )
// enables parsing of NaN. Enabling it here as JsonUtil class currently in
// use supports it.
mapper.configure(JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS, true )
mapper.setSerializationInclusion(Include.NON_NULL)
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
mapper.setSerializationInclusion(Include.NON_EMPTY)
mapper.setSerializationInclusion(Include.NON_ABSENT)
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
}
def fromJson(json: String, clazz: Class[_]) = {
try {
mapper.readValue( json, clazz )
} catch {
case e: com.fasterxml.jackson.core.JsonParseException => {
println("Error while parsing JSON " + json)
}
}
}
}
Кто-нибудь может сказать, что я здесь делаю не так?
case class Person(itemId: Map[String, Int], itemNames: Map[String, Int]) extends Serializable
val test = """{}"""
JacksonUtil.fromJson(test, classOf[Person])
Есть ли какая-нибудь конфигурация, которую я должен добавить? Я не могу изменить картограф Джексона из-за некоторых ограничений.
Я получаю такое же исключение, когда пытаюсь использовать правильный:
val test1 = """{"itemId": {"A": 1,"B": 8},"itemNames": {"AMC" : 2, "Regal" : 5}"""
JacksonUtil.fromJson(test1, classOf[Person])
}
. Я пробовал комментировать//mapper.setSerializationInclusion(Include.NON_ABSENT)
, поскольку этой конфигурации нет в версии Джексона, которую я использую. Я получилPerson(null,null) Person(Map(A -> 1, B -> 8),Map(AMC -> 2, Regal -> 5))
после того, как отредактировал вашу вторую строку JSON. - person vindev   schedule 23.03.2018