Получение нулевых значений из JSON с использованием Circe-оптики - PullRequest
3 голосов
/ 23 октября 2019

JSON у меня выглядит так:

{
    "cards": [
        {
            "card_id":"1234567890",
            "card_status":"active",
            "card_expiration":{
                "formatted":"01/20"
            },
            "debit":{
                "masked_debit_card_number":"1111 **** **** 1111",
            }
        },
        {
            "card_id":"1234567891",
            "card_status":"active",
            "card_expiration":null,
            "debit":{
                "masked_debit_card_number":"2222 **** **** 2222",
            }
        }
    ]
}

Я пытаюсь получить все значения card_expiration полей, используя эту функцию:

def getExpirations(json: Json) =
    root
        .cards
        .each
        .filter(root.card_status.string.exist(_ == "active"))
        .card_expiration
        .selectDynamic("formatted")
        .string
        .getAll(json)

Дело в том, чтоВышеупомянутое выражение возвращает только 1 результат - для первой карты, но мне действительно нужно получить что-то вроде List(Some("01/20"), None)! Что я могу сделать в этой ситуации?

1 Ответ

3 голосов
/ 23 октября 2019

Проблема в том, что к тому времени, как вы сделали шаг formatted, вы уже не соответствует истечению null. Вы могли бы сделать что-то вроде этого:

import io.circe.Json, io.circe.optics.JsonPath.root

def getExpirations(json: Json) =
  root
    .cards
    .each
    .filter(root.card_status.string.exist(_ == "active"))
    .card_expiration
    .as[Option[Map[String, String]]]
    .getAll(json)

Или:

import io.circe.Json, io.circe.generic.auto._, io.circe.optics.JsonPath.root

case class Expiration(formatted: String)

def getExpirations(json: Json) =
  root
    .cards
    .each
    .filter(root.card_status.string.exist(_ == "active"))
    .card_expiration
    .as[Option[Expiration]]
    .getAll(json)

А затем:

scala> getExpirations(io.circe.jawn.parse(doc).right.get)
res0: List[Option[Expiration]] = List(Some(Expiration(01/20)), None)

Без дополнительного контекста, на мой взгляд, не ясно, чтоЭто хороший пример использования оптики. Возможно, вам лучше расшифровывать классы дел или использовать курсоры. Если бы вы могли предоставить больше информации, это было бы легче сказать.

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