Разбор плохого Json в Scala - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь проанализировать какой-то проблемный Json в Scala, используя Play Json и используя неявное, но не знаю, как поступить ...

Json выглядит так:

"rules": {
    "Some_random_text": {
      "item_1": "Some_random_text",
      "item_2": "text",
      "item_n": "MoreText",
      "disabled": false,
      "Other_Item": "thing",
      "score": 1
    },
    "Some_other_text": {
      "item_1": "Some_random_text",
      "item_2": "text",
      "item_n": "MoreText",
      "disabled": false,
      "Other_Item": "thing",
      "score": 1
    },
    "Some_more_text": {
      "item_1": "Some_random_text",
      "item_2": "text",
      "item_n": "MoreText",
      "disabled": false,
      "Other_Item": "thing",
      "score": 1
    }
}

Я использую неявное средство чтения, но поскольку каждый элемент верхнего уровня в rules фактически является отдельной вещью, я не знаю, как с этим справиться ...

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

Чтобы сделать мою жизнь еще сложнее, после этих элементов есть много вещей в других форматах, которые мне действительно не нужны,Они являются неназванными элементами, которые только начинаются: {случайный юридический Json ...}, {more Json ...}

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

Спасибо за ваши мысли.

1 Ответ

0 голосов
/ 29 декабря 2018

Я использую неявное средство чтения, но поскольку каждый элемент верхнего уровня в правилах - это, по сути, отдельная вещь, я не знаю, как с этим справиться ...

Воспроизведение читателей JSONзависит от знания имен полей заранее.Это касается считывателей, созданных вручную, а также считывателей, сгенерированных макросами.Вы не можете использовать неявный читатель в этом случае.Вам нужно сначала пройтись и извлечь фрагменты Json, которые имеют регулярную структуру с известными именами и типами полей.Например, вот так:

  case class Item(item_1: String, item_2: String, item_n: String, disabled: Boolean, Other_Item: String, score: Int)

  implicit val itemReader: Reads[Item] = Json.reads[Item]

  def main(args: Array[String]): Unit = {
    // parse JSON text and assume, that there is a JSON object under the "rules" field
    val rules: JsObject = Json.parse(jsonText).asInstanceOf[JsObject]("rules").asInstanceOf[JsObject]
    // traverse all fields, filter according to field name, collect values
    val itemResults = rules.fields.collect {
      case (heading, jsValue) if heading.startsWith("Some_") => Json.fromJson[Item](jsValue) // use implicit reader here
    }
    // silently ignore read errors and just collect sucessfully read items
    val items = itemResults.flatMap(_.asOpt)
    items.foreach(println)
  }

Отпечатки:

Item(Some_random_text,text,MoreText,false,thing,1)
Item(Some_random_text,text,MoreText,false,thing,1)
Item(Some_random_text,text,MoreText,false,thing,1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...