我试图在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)))
答案 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
)