Работа с необязательным полем с lihaoyi ujson - PullRequest
1 голос
/ 08 марта 2019

Я хочу использовать ujson из библиотеки upickle для извлечения необязательной строки из документа json. В некоторых документах поле json существует, в других нет.

Когда доступ к полю и поле не существует, я получаю исключение NoSuchElementException:

val json = ujson.read(jsonString)
json("attributename").str

results in: java.util.NoSuchElementException: key not found: attributename

Какой идиоматический способ работы с необязательными атрибутами json в ujson?

Ответы [ 3 ]

1 голос
/ 08 марта 2019

Я думаю, что идиоматический способ состоит в том, чтобы иметь класс case вместо того, чтобы идти против JSON AST вручную.

В вашем случае вы можете иметь поле Option[String].

case class MyModel( attributeName: Option[String] )
implicit val rw: ReadWriter[MyModel] = macroRW

read[MyModel](jsonString)

Но, судя по всему, вы могли бы сделать

json.obj.value.get("attributename").map(_.str)

чтобы получить Option[String] обратно.

0 голосов
/ 08 марта 2019

Если вы хотите вернуть значение по умолчанию в случае какого-либо исключения, вы можете использовать Try с getOrElse:

val result = Try(json("attributename").str).getOrElse("defaultValue")

Результатом будет значение attributename key или defaultValue string, если такого ключа нет.

0 голосов
/ 08 марта 2019

Я не уверен, но я искал репозиторий GitHub здесь Кажется, в строке 62 и из строки 87 до строки 99 он просто вызывает x.obj(i).

Этоне выполняет никакой проверки, а просто позвонить.Это приводит к java.util.NoSuchElementException, потому что пытается получить доступ без проверки.Я не видел ни одной версии, чтобы получить Option или даже выполнить проверку, если это значение существует.

Я бы предложил пройти через идиому Try / Success / Failure на scala

val tryAttr = Try{json("attributename").str}
tryAttr match {
  case Success(_) => doYourThing
  case Failure(t: NoSuchElementException) => DoSomethingElse
}
...