Как преобразовать строку json в карту scala?

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

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

{"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 обратно в исходную карту, которая была у меня до того, как я ее преобразовал.


person Udit Mehta    schedule 28.04.2015    source источник
comment
почему бы вам не использовать JSON.parseRaw?   -  person turutosiya    schedule 28.04.2015
comment
Можете ли вы опубликовать пример JSON и любого другого полезного кода? или информация?   -  person Garis M Suero    schedule 28.04.2015
comment
Как можно сериализовать Any?   -  person Chris Martin    schedule 28.04.2015


Ответы (2)


Я попробовал следующий метод с 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 в каждом методе, если он доступен в области видимости.

person lambdista    schedule 28.04.2015
comment
Привет, @lambdista, код выглядит идеально. и я хочу реализовать это как настраиваемую функцию в Spark, но фреймы данных Spark не поддерживают никаких ссылок, и я пробовал то же самое с String, String, но, похоже, он не работает. У вас есть идея, как сделать шрифт специфичным? Спасибо - person knowledge_seeker; 04.02.2018
comment
@game_changer Немного поздно, но вы можете использовать его как Map[String, String]. Я делаю следующее, чтобы разобрать плоский json из свойств конфигурации искры if (jsonMap.keySet.forall(_.isInstanceOf[String])) jsonMap.asInstanceOf[Map[String, String]]. Тогда я использовал JSON.parseFull (устарел), который возвращал Some(map: Map[_, _]). - person belgacea; 15.10.2019

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

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

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

person user297112    schedule 01.09.2016