我有一个JSON对象,其中一部分是映射到AnyRef的,因为它可能包含变量键/值对。我把那部分当作垃圾抽屉。但是我必须在这个AnyRef对象中添加"id“和随机密钥。我怎么能这么做?
我尝试过这样做,但是映射是存储的,生成的JSON看起来不太正确。
以下是我的例子:
val map1 = requestStateChange.cloudModel.asInstanceOf[Option[Map[String, AnyRef]]]
val newModel = List(("id", java.util.UUID.randomUUID().toString)).toMap[String, AnyRef] ++ map1.get我真正想要的是这样的东西:
{
"model": {
"id": "c9725317-e2e5-43e8-876e-5ab6a16b951d"
"version": "v1",
"location": "...",
"type": "...",
"data": {
"id": "9520146"
}
}
}感谢你的帮助。
发布于 2015-04-13 23:59:34
别在这里重新发明轮子。作为经验法则,惯用Scala在可能的情况下避免使用像Any这样的类型。有很多库可以让您轻松地处理JSON。您可以考虑玩JSON。如果您正在使用该库,您可以这样做:
val myJsonString = """{ "foo" : "bar" }"""
val map = Json.parse(myJsonString).as[JsObject]
val newMap = map + ("id" -> JsNumber(123)) //Adding a new property is easy now
Json.stringify(newMap) // {"foo":"bar","id":123}, as desired您可以阅读更多关于Play JSON 这里的内容。您可以阅读有关使用JSON 这里的其他替代方案。
如果确实需要实例化AnyRef,则可以将任何类型分配给AnyRef,但基本值类型除外:
Map(1 -> "a") : AnyRef您可以考虑使用Any而不是AnyRef,后者甚至更通用,并且还允许您使用基本的值类型,例如1 : Any。您可以更多地了解Any、AnyRef和AnyVal 这里之间的关系。以您为例,您可以这样做:
val map1 : Map[String, Any] = Map("model" -> Map("version" -> "v1"))
val model = map1("model").asInstanceOf[Map[String, Any]]
val newModel = model.updated("id", 123)
val newMap = map1.updated("model", newModel)https://stackoverflow.com/questions/29616750
复制相似问题