如何创建一个新的 AnyRef?

How to create a new AnyRef?

我有一个 JSON 对象,我将其中的一部分映射到 AnyRef,因为它可能包含变量 key/value 对。我把那个部分当作垃圾抽屉。但我必须向 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"
    }
  }
}

感谢您的帮助。

不要在这里重新发明轮子。根据经验,惯用的 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. You can read about other alternative to Play JSON here

如果您确实需要实例化 AnyRef,您可以将任何类型分配给 AnyRef,但基本值类型除外:

Map(1 -> "a") : AnyRef

您可以考虑使用 Any 而不是 AnyRef,后者更通用,并且还允许您使用基本值类型,例如 1 : Any。您可以阅读有关 AnyAnyRefAnyVal 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)