Как преобразовать любую строку JSON в Map [Symbol, Any] с помощью import play.api.libs.json?

#json #scala #playframework-2.3

#json #scala #playframework-2.3

Вопрос:

Я не могу понять, есть ли способ преобразовать фрагмент JSON (в виде строки) в Map[Symbol,Any] используемую play.api.libs.json библиотеку, где Any может быть a Int , a Double , a String или a вложенный Map[Symbol,Any] .

Может кто-нибудь дать мне подсказку, чтобы получить это?

Комментарии:

1. Это возможно, но есть так много лучших способов работы с JSON в Play.

2. Я знаю Трэвиса, но конкретный сценарий, с которым я сталкиваюсь, очень хорошо подходит для этого подхода.

Ответ №1:

JsObject.fieldSet даст вам a Set[(String, JsValue)] , который вы можете преобразовать в Map[Symbol, Any] . Вам нужно будет сопоставить шаблоны для всех возможных подклассов JsValue и преобразовать каждый из них в нужный вам тип.

Например, что-то вроде этого:

  Json.parse(text) match {

    case js: JsObject => 
      js.fieldSet.map { 
        case (key, value) => Symbol(key) -> transform(value) 
      }.toMap

    case x => throw new RuntimeException(s"Expected object json but got $text")
 }

 def transform(jsValue): Any = jsValue match {
    case JsNumber(value) => value.toDouble
    ...ect...
 }