Mohan
Mohan

Reputation: 473

Deserialization of json using jackson in scala

I am trying to de-serialize the below json string to scala object using jackson json api

{ "Domain1": { "data-file": "dataFile1", "filter": { "affected-object": "AffectedObject1", "affected-nd": "AffectedNd1" } }, "Domain2": { "data-file": "dataFile2", "filter": { "affected-ci": "AffectedCI2", "affected-net": "AffectedNet2" } } }

I tried to use case class and tried first using "ClassOf" in ValueType of "readValue" Method but the output is Map of Map Object. Data is not converted into Case Class Object.

case class CrossDomainFilterObj(@JsonProperty("data-file")dataFile: String, 
@JsonProperty("filter")filter: Map[String,String])

val jsonString = "{\"Domain1\": {\"data-file\": \"dataFile1\", \"filter\": { \"affected-object\":
\"AffectedObject1\", \"affected-nd\" : \"AffectedNd1\"}},\"Domain2\": {\"data-file\": 
\"dataFile2\", \"filter\": { \"affected-ci\":\"AffectedCI2\", \"affected-net\" : 
\"AffectedNet2\"}}}"

val mapper = new ObjectMapper
mapper.registerModule(DefaultScalaModule)
val data = mapper.readValue(jsonString, classOf[Map[String, CrossDomainFilterObj]])
println(data)

I am getting output like below

Map(Domain1 -> Map(data-file -> dataFile1, filter -> Map(affected-object ->
AffectedObject1, affected-nd -> AffectedNd1)), Domain2 -> Map(data-file -> 
dataFile2, filter -> Map(affected-ci -> AffectedCI2, 
affected-net -> AffectedNet2)))

But I am expecting an output like below

Map(Domain1 -> CrossDomainFilterObj(dataFile1, Map(affected-object -> 
AffectedObject1, affected-nd -> AffectedNd1)), Domain2 -> 
CrossDomainFilterObj(dataFile2, Map(affected-ci -> 
AffectedCI2, affected-net -> AffectedNet2)))

Then i tried using TypeReference as ValueType as shown below,

case class CrossDomainFilterObj(@JsonProperty("data-file")dataFile: String, 
@JsonProperty("filter")filter: Map[String,String])

val jsonString = "{\"Domain1\": {\"data-file\": \"dataFile1\", \"filter\": { \"affected-object\":
\"AffectedObject1\", \"affected-nd\" : \"AffectedNd1\"}},\"Domain2\": {\"data-file\": 
\"dataFile2\", \"filter\": { \"affected-ci\":\"AffectedCI2\", \"affected-net\" : 
\"AffectedNet2\"}}}"

val mapper = new ObjectMapper
mapper.registerModule(DefaultScalaModule)

val reference = new TypeReference[Map[String, CrossDomainFilterObj]] {}
val data = mapper.readValue(jsonString, reference)
println(data)

I am getting error like below

dead code following this construct 

"val data = mapper.readValue(jsonString, reference)"

Could someone help to identify what I am doing wrong here.

Upvotes: 0

Views: 806

Answers (1)

Dima
Dima

Reputation: 40510

Just make sure you use ScalaObjectMapper:

val mapper = new ObjectMapper() with ScalaObjectMapper

Then this should work:

val data = mapper.readValue[Map[String, CrossDomainFilterObj]](jsonString)

Upvotes: 1

Related Questions