2015-04-13 2 views
1

У меня есть объект JSON и его часть Я сопоставляюсь с AnyRef из-за того, что он может содержать пары переменных/значений. Я рассматриваю этот раздел как нежелательный ящик. Но я должен добавить «id» и случайный ключ к этому объекту AnyRef. Как я могу это сделать?Как создать новый AnyRef?

Я попытался сделать следующее, но карта сохранена, и сгенерированный 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" 
    } 
    } 
} 

Цените за вашу помощь.

ответ

4

Не изобретайте велосипед здесь. Как правило, идиоматическая Scala избегает использования таких типов, как Any, когда это возможно. Существует множество библиотек, которые позволяют вам легко общаться с JSON. Вы можете рассмотреть Play 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 и AnyValhere. Например, вы можете сделать что-то вроде этого:

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)