15

我想将 json 提取为 Play 应用程序中的案例类。case类中的属性在camelCase中定义,json数据在snake_case中。

case class User(userId: Long, userName: String)

和 json 会像这样 {"user_name":"Vishal","user_id":67}

是否有一种简单的方法可以指示 play json 自动进行映射和提取,例如提供一些注释等。

4

4 回答 4

13

这是一个很老的问题,但我没有找到任何答案,所以我去了 Play JSON Github 存储库并找到了这个:

implicit val config = JsonConfiguration(SnakeCase)

implicit val userReads: Reads[PlayUser] = Json.reads[PlayUser]

所以,现在似乎存在这样做的官方方式

https://github.com/playframework/playframework/blob/d96d42e4baa2261d0e0a9c36518f6921e247e402/documentation/manual/working/scalaGuide/main/json/code/ScalaJsonAutomatedSpec.scala#L128

于 2016-10-21T09:57:48.983 回答
1

有关此问题的官方解决方案,请参阅@GlauberCampinho 的答案
, 在撰写此答案时尚不存在。


Play 使用杰克逊。在 Java 中,您可以使用属性上的 Jackson 注释org.codehaus.jackson.annotate.JsonProperty手动设置名称。参数的value参数将用作键的名称。

@JsonProperty("user_name")
String userName;

我不知道这是否也适用于使用 Scala 的 Play。根据这个线程中关于 Scala 和 Jackson的评论,反序列化的语法应该是这样的:

class User @JsonCreator()( @JsonProperty("user_id") val userId:Long, @JsonProperty("user_name") val userName:String )

您可以在此问题的案例类中找到另一个 Jackson 注释示例。

于 2013-08-13T13:09:28.257 回答
1

如果您使用的是 Play 2 的 JSON Inception,那么不。如果您不是,那么您可以只使用 @JsonProperty 注释。

我试图让它与 JSON Inception 一起工作几天,使用各种形式和配置的 jerkson/jackson 注释,但没有这样的运气!

于 2013-08-26T03:06:22.347 回答
0

对于 Play Json 2.x:https ://github.com/tototoshi/play-json-naming

这似乎完全满足我正在寻找的东西,希望它有所帮助!

于 2016-06-22T15:12:27.877 回答