使用 circe-optics 从 json 中检索空值
Retrieving null values from json using circe-optics
我的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)
问题是,上面的表达式只有 returns 1 个结果 - 对于第一张卡片,但我真的需要得到类似 List(Some("01/20"), None)
的结果!这种情况我该怎么办?
问题是当您完成 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)
在没有更多上下文的情况下,我并不清楚这是一个很好的 circe-optics 用例。您最好解码成 类 大小写,或者使用游标。如果你能提供更多信息,就更容易判断了。
我的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)
问题是,上面的表达式只有 returns 1 个结果 - 对于第一张卡片,但我真的需要得到类似 List(Some("01/20"), None)
的结果!这种情况我该怎么办?
问题是当您完成 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)
在没有更多上下文的情况下,我并不清楚这是一个很好的 circe-optics 用例。您最好解码成 类 大小写,或者使用游标。如果你能提供更多信息,就更容易判断了。