使用lihaoyi ujson处理可选字段

时间:2019-03-08 10:18:19

标签: scala upickle

我想使用upickle library的ujson从json文档中提取可选字符串。在某些文档中,存在json字段,而在其他文档中则不存在。

当访问该字段并且该字段不存在时,我收到NoSuchElementException:

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

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

在ujson中处理可选json属性的惯用方式是什么?

5 个答案:

答案 0 :(得分:1)

我认为惯用的方法是拥有一个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]

答案 1 :(得分:0)

如果您想在遇到任何异常的情况下返回默认值,则可以将TrygetOrElse一起使用:

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

结果将是attributename键或defaultValue字符串的值(如果没有这样的键)。

答案 2 :(得分:0)

根据liahoy

规范的方法是添加None默认值

example

import upickle.default._

case class User(name: String, age: Option[Int] = None)
implicit val userRW: ReadWriter[User] = macroRW
read[User]("""{ "name": "Picard" }""")

输出

res0: User = User(Picard,None)

答案 3 :(得分:0)

别忘了,json是一个对象。

所以我们可以像这样检查它:

val json = ujson.read(jsonString)
if (json.obj.get("attributename").nonEmpty) {
  json("attributename").str
  ...
}

顺便说一句,您可以这样获得keySet:

json.obj.keySet

答案 4 :(得分:-1)

我不确定,但是,我正在寻找GitHub存储库here 似乎在第62行以及从第87行到第99行,它只是调用ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());

它不执行任何检查,只是调用它。这导致x.obj(i),因为试图不加检查地访问。我没有看到任何版本来获得Option,甚至没有检查此值是否存在。

我建议通过scala上的Try / Success / Failure习惯用法

java.util.NoSuchElementException