如何使用Play的json序列化/反序列化动态字段名称

rot*_*erl 3 scala playframework

我正在使用Play framework 2.2.2.我正在尝试像这样处理json请求

[
  {
    "id" : "123",
    "language" : "en",
    "text" : "This is an example of a text",
    "Metadata_IP" : "192.168.20.34",
    "Metadata_date" : "2001-07-04T12:08:56.235-0700"
  },
  {
    "id" : "124",
    "language" : "en",
    "text" : "Some more text here",
    "Metadata_IP" : "192.168.20.31",
    "Metadata_date" : "2001-07-04T12:09:56.235-0700",
    "Metadata_name" : "someone"
  }
]
Run Code Online (Sandbox Code Playgroud)

Metadata_字段是动态字段,意味着用户可以发送他想要的内容(例如,Metadata_color等...)处理此问题的最佳方法是什么?

我可以使用Readers将其反序列化为case class吗?我怎样才能做到这一点?我想动态字段将是Map [String,String],但是我应该如何让读者解析这个呢?

谢谢

joh*_*ren 6

像这样的东西可以工作:

implicit object jsObjToKeyValueSeq extends Reads[Seq[(String, String)]] {
  override def reads(json: JsValue) = json match {
    case js: JsObject => 
      JsSuccess(js.fields.collect { case (key, JsString(value)) => key -> value })
    case x => JsError(s"Unexpected json: $x")
  }
}
Run Code Online (Sandbox Code Playgroud)