我有一个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"
}
}
}
感谢您的帮助。
答案 0 :(得分:4)
不要在这里重新发明轮子。根据经验,惯用的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 here的更多信息。您可以阅读有关Play JSON here的其他替代方法。
如果确实需要实例化AnyRef
,则可以将任何类型分配给AnyRef
,但基本值类型除外:
Map(1 -> "a") : AnyRef
您可以考虑使用Any
代替AnyRef
,这更为一般,并允许您使用基本值类型,例如1 : Any
。您可以详细了解Any
,AnyRef
和AnyVal
here之间的关系。对于您的示例,您可以执行以下操作:
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)