【问题标题】:how to represent nested JSON object in a case class using Json4s?如何使用 Json4s 在案例类中表示嵌套的 JSON 对象?
【发布时间】:2015-09-01 16:34:37
【问题描述】:

给定一个示例 JSON 对象,其中包含一个属性未知的嵌套对象:

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

我曾尝试将 json4s 的提取函数与以下案例类(在 Scala 中)一起使用:

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

这会导致以下错误:

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

是否可以在不定义 eventProperties 的所有可能属性的情况下做到这一点?

更新: json4s 3.2.10 中有一个错误导致此问题 - 更新到 3.2.11 并提取到 Map[String,Any] 工作正常。

【问题讨论】:

    标签: json scala jackson json4s


    【解决方案1】:

    我不确定你在做什么来获得你发布的异常,但以下工作(注意 Map 而不是 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]
    

    【讨论】:

    • 谢谢,但使用这个我得到:scala> org.json4s.package$MappingException: No usable value for eventProperties 没有关于类型的信息
    • 原来在 3.2.10 中有一个错误,这就是问题所在 - 3.2.11 修复了它
    • 如果你打算序列化更复杂的东西,我建议使用 Jackson + Scala 插件进行序列化/反序列化。上次我检查它支持比 json4s 更大的 Scala 构造子集。 json4s 无论如何都在内部使用 Jackson。
    【解决方案2】:

    为了将 eventProperties 作为 List[(String, Any)],你的 json 应该是,

             """ {
                   "key": "01234",
                   "eventProperties": [
                       {"unknownProperty1": "value"},
                       {"unknownProperty2": "value"},
                       {"unknownProperty3": "value"}
                   ]
               }"""
    

    否则,您可以使用 Map 而不是 List 作为 case class nestedClass1(key:String, eventProperties:Map[String,Any]) 然后转换成nestedClass 为nestedClass( n1.key, n1.eventProperties.toList)

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2016-01-13
      • 2017-01-20
      相关资源
      最近更新 更多