jackson-module-scala icon indicating copy to clipboard operation
jackson-module-scala copied to clipboard

Deserialization with @JsonAnySetter

Open migel opened this issue 10 years ago • 1 comments

Hi, I get an exception when using @JsonAnySetter:

com.fasterxml.jackson.databind.JsonMappingException: Argument #0 of constructor [constructor for java.util.LinkedHashMap, annotations: [null]] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator

The test case:

import org.scalatest.FunSuite
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.annotation.JsonAnyGetter
import com.fasterxml.jackson.annotation.JsonAnySetter
import java.util.HashMap
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.databind.SerializationFeature
import com.fasterxml.jackson.annotation.PropertyAccessor
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility

class Data3 {
  @JsonProperty var a = 3;

  @JsonAnyGetter def getProperties() = {
    val map = new HashMap[String, Object]()
    map.put("b", 2.asInstanceOf[Object])
    map
  }

  @JsonAnySetter def setProperties(name: String, value: Object) {
    println(s"name: ${name} class: ${value.getClass.getName} value: ${value}")
  }
}

class TestAnyGetterSetter extends FunSuite {
  test("anygettersetter") {
    val mapper = new ObjectMapper()

    mapper.registerModule(DefaultScalaModule)
    mapper.enable(SerializationFeature.INDENT_OUTPUT)
    mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE)

    val d0 = new Data3
    val d0Json = mapper.writeValueAsString(d0)

    // throws JsonMappingException
    val d1 = mapper.readValue(d0Json, classOf[Data3])
  }
}

migel avatar Mar 28 '15 18:03 migel

How can we use @JsonAnySetter for case classes in scala?

abhisheky2095 avatar Apr 06 '18 08:04 abhisheky2095