使用JSON Transformer将元素添加到对象根目录

时间:2014-07-11 01:03:38

标签: json scala playframework-2.0

我试图在Play中使用JSON变换器!所以我不需要从JSON -> Scala -> JSON序列化,但我在使用变换器添加字段到我的传入JSON对象时遇到了麻烦。

我的javascript应用程序将对象发布到我的播放控制器。该操作需要向入站对象添加3个字段,然后将其发布到RabbitMQ。

说这是发布到我的控制器的对象

{
  price: 300,
  sku: 1234
}

我正在尝试将其转换为

{
  createdBy: someone@example.com,
  created: //Date in ISO format,
  id: 4321,
  price: 300,
  sku: 1234
}

这就是我所拥有的

val id = java.util.UUID.randomUUID
val created = getDateAsIso()
val trnsfm = (__ \ 'user).json.put(user.email) andThen
             (__ \ 'created).json.put(created) andThen
             (__ \ 'id).json.put(id)

val payload = request.body.transform(trnsfm)

结果是JsSuccess只有一个元素,变换值

中的最后一个元素
JsSuccess({"id":"9f76bb9a-82b4-43e4-9afe-84ccb4b6dcc0"},)

有没有办法完成我在 Coast-to-coast 风格中尝试做的事情,还是我被困在序列化/反序列化?

更新

提供的代码@Travis Brown非常接近工作,但我需要使用JsString类设置值

val trnsfm = __.json.update((__ \ 'user).json.put(JsString(user.email))) andThen
         __.json.update((__ \ 'created).json.put(JsString(created))) andThen
         __.json.update((__ \ 'id).json.put(JsString(id)))

2 个答案:

答案 0 :(得分:2)

put实际上会忽略其输入,因此您需要将其与update结合使用:

val trnsfm = __.json.update((__ \ 'user).json.put(user.email)) andThen
             __.json.update((__ \ 'created).json.put(created)) andThen
             __.json.update((__ \ 'id).json.put(id))

如果这是您在输入JSON上执行的唯一操作,则变换器可能不是最佳解决方案(+上的++JsObject方法将是更简洁,例如)。

答案 1 :(得分:0)

val trnsfm = __.json.update( 
  (
    (__ \ 'user).json.put(JsString("someone@example.com")) and
    (__ \ 'created).json.put(JsNumber(1324132)) and
    (__ \ 'id).json.put(JsNumber(324123))
  )reduce
)