Получение данных из массива json в scala - PullRequest
0 голосов
/ 01 августа 2020

Я только что начал работать над scala. У меня есть следующий массив json:

[
  {
     "id": "1",
    "formatType": "text",
    "value": "bgyufcie huis huids hufhsduhfsl hd"
  },
  {
    "id": "2",
    "formatType": "text size",
    "value": 12
  },
  {
    "id": "3",
    "formatType": "text alignment",
    "value" : "right"
  }
]

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

 {
        "id": "2",
        "formatType": "text size",
        "value": 12
      }

и так далее для других идентификаторов. Я написал код, который сравнивает идентификатор и возвращает мне json, который выглядит следующим образом.

val getid = jsonString.parseJson match {
      case JsArray(elements) => elements.map(x => if(x.asJsObject().getFields("Id")(0).toString().replace("\"", "") == key) x)
    }

Этот код отлично работает, когда в массиве json у меня только один json. Но когда у меня есть несколько json с идентификаторами, как показано выше, этот код сравнивает только последнюю запись. То есть в этом случае сравниваются только данные с идентификатором 3. Это не сравнение с идентификаторами 1 и 2, из-за чего я не могу получить желаемые результаты. Я пробовал использовать для каждого здесь, но у меня это не сработало. для каждого печатает полные данные в символах. Как я могу проверить все записи в моем массиве json, сопоставить идентификатор и вернуть его?

1 Ответ

1 голос
/ 01 августа 2020

Я согласен с комментариями о том, что не нужно задавать несколько вопросов и смотреть на существующие ответы (и принимать правильные ответы!).

Однако в этом конкретном случае вам просто нужно использовать find вместо map:

val getid = jsonString.parseJson match {
  case JsArray(elements) =>
    elements.find(_.asJsObject().getFields("Id")(0).toString().replace("\"", "") == key)
  case _ =>
    None
}

Это вернет None, если id не найден или JSON не является JsArray, в противном случае он вернет Some(element)

В более общем плане, вместо обработки необработанных JSON объектов, я бы рекомендовал использовать библиотеку, которая преобразует все JSON в Scala объекты, а затем обрабатывает эти Scala объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...