Search code examples
jsonscalajacksonjson4s

how to represent nested JSON object in a case class using Json4s?


Given an example JSON object with a nested object who's properties are unkown:

      { "Key":"01234",
          "eventProperties":{
             "unknownProperty1":"value",
             "unknownProperty2":"value",
             "unknownProperty3":"value"
          },
       }

I have tried to use json4s' extract function with the following case class (In Scala):

case class nestedClass(Key:String, eventProperties:Map[(String,Any)])

Which results in the following error:

org.json4s.package$MappingException: Can't find constructor for nestedClass

Is it possible to do this without defining every possible property of eventProperties?

Update: there was a bug in json4s 3.2.10 causing this issue - updating to 3.2.11 and extracting to Map[String,Any] works fine.


Solution

  • I'm not sure what you are doing to get the exception you have posted, but the following works (note a Map instead of List):

    import org.json4s._
    import org.json4s.jackson.JsonMethods._
    import org.json4s.DefaultFormats
    
    val json = parse("""
    { "key":"01234",
      "eventProperties":{
        "unknownProperty1":"value",
        "unknownProperty2":"value",
        "unknownProperty3":"value"
      }
    }
    """)
    
    case class NestedClass(key:String, eventProperties:Map[String,Any])
    
    implicit val formats = DefaultFormats
    
    json.extract[NestedClass]