Scala:从原始的json对象添加另一个字段

时间:2017-04-20 15:47:57

标签: json scala

我有这个功能:

def convertUsersToJsonOrig(lusers: Seq[User]): JsValue = {
    Json.toJson(
        lusers.map { u => Map("id" -> u.id, 
                              "firstName" -> u.firstName, 
                              "lastName" -> u.lastName, 
                              "mobile" -> u.mobile, 
                              "email" -> u.email, 
                              "username" -> u.username, 
                              "password" -> u.password)}
    )

}

但是,我想添加一个字段,如:

def convertUsersToJsonOrig(lusers: Seq[User]): JsValue = {
    Json.toJson(
        lusers.map { u => Map("id" -> u.id, 
                              "firstName" -> u.firstName, 
                              "lastName" -> u.lastName, 
                              "mobile" -> u.mobile, 
                              "email" -> u.email, 
                              "username" -> u.username, 
                              "password" -> u.password,
                              "rowNum"   -> 0
                      )}
    )
}

但这给了我一个错误:

No Json serializer found for type Seq[scala.collection.immutable.Map[String,Any]]. Try to implement an implicit Writes or Format for this type.

rowNum不是用户的字段。

可以这样做吗?谢谢!

2 个答案:

答案 0 :(得分:2)

原始Map被推断为类型为Map[String, String]toJson知道如何序列化。

但是然后你添加了一个数值,所以现在地图变成了Map[String, Any],以便同时容纳数字和字符串。但是toJson并不知道如何处理Any

如果您将值设为字符串"rowNum" -> "0",它将起作用,但这不一定是您想要的。我不知道你正在使用哪一个,但是所有JSON库都提供了用于表示异构对象的包装类,这应该是这样的:

val userJson: JsValue = JsObject(
  "firstName" -> JsString(u.firstName),
  "age"       -> JsNumber(u.age)
)

答案 1 :(得分:0)

好吧,我无法在Scala中添加该字段。但是,我能够在ES6中使用:

      $.extend(true, {}, {'rowNumber':i}, json_data [i])

其中json_data包含来自服务器的所有对象的数组。