2015-04-28 4 views
6

У меня есть вложенный json, структура которого не определена. Он может быть другим при каждом запуске, поскольку я читаю из удаленного файла. Мне нужно преобразовать этот json в карту типа Map[String, Any]. Я попытался заглянуть в json4s и парсеров Jackson, но они, похоже, не решают эту проблему. Кто-нибудь знает, как я могу это достичь?Как преобразовать строку json в карту scala?

Пример строки:

{"body":{ 
    "method":"string", 
    "events":"string", 
    "clients":"string", 
    "parameter":"string", 
    "channel":"string", 
    "metadata":{ 
     "meta1":"string", 
     "meta2":"string", 
     "meta3":"string" 
    } 
}, 
"timestamp":"string"} 

Уровень вложенности может быть произвольным и не предопределены.
Чтобы помочь в использовании:
У меня есть карта [String, Any], которую мне нужно сохранить в файле в качестве резервной копии. Поэтому я конвертирую его в строку json и сохраняю в файле. Теперь каждый раз, когда я получаю новые данные, мне нужно получить json из файла, снова преобразовать его в карту и выполнить некоторые вычисления. Я не могу сохранить карту в памяти, так как потерял бы ее, если моя работа не удалась.
Мне нужно решение, которое преобразует строку json обратно в исходную карту, которую я имел до того, как я ее преобразовал.

+0

Почему вы не используете JSON.parseRaw? – turutosiya

+0

Можете ли вы опубликовать пример JSON и любого другого полезного кода? или информация? –

+0

Как вы можете сериализовать 'Any'? –

ответ

6

Я попробовал следующий метод с json4s 3.2.11 и он работает:

import org.json4s._ 
import org.json4s.jackson.JsonMethods._ 

//... 
def jsonStrToMap(jsonStr: String): Map[String, Any] = { 
    implicit val formats = org.json4s.DefaultFormats 

    parse(jsonStr).extract[Map[String, Any]] 
} 

Может быть, вы не определите implicit val типа Formats? Обратите также внимание на то, что вам не нужно иметь implicit val в каждом и каждом методе, если в нем находится.

+0

Эй, @ lambdista, Код выглядит отлично. и я хочу реализовать это как пользовательскую функцию в искро, но искровые кадры данных не поддерживают «any» ref, и я попробовал то же самое со String, String, но он, похоже, не работает. Есть ли у вас какая-либо идея, как мы можем задать тип? благодаря – GSR

1

Вы можете использовать следующий код для разбора строки JSON в Map[String, Any]

val jsonMap = parse(jsonString).values.asInstanceOf[Map[String, Any]] 

Однако это не типизированный и, следовательно, следует использовать с осторожностью при извлечении значений из карты.

Смежные вопросы