如何创建一个新的 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
。您可以阅读有关 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)
我有一个 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
。您可以阅读有关 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)