首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用lihaoyi ujson处理可选字段

用lihaoyi ujson处理可选字段
EN

Stack Overflow用户
提问于 2019-03-08 18:18:19
回答 5查看 868关注 0票数 4

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

当访问该字段且该字段不存在时,我会得到一个NoSuchElementException:

代码语言:javascript
复制
val json = ujson.read(jsonString)
json("attributename").str

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

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

EN

回答 5

Stack Overflow用户

发布于 2019-03-08 19:43:24

如果您想在发生任何异常时返回默认值,您可以结合使用TrygetOrElse

代码语言:javascript
复制
val result = Try(json("attributename").str).getOrElse("defaultValue")

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

票数 2
EN

Stack Overflow用户

发布于 2019-03-08 20:25:17

我认为最常用的方法是创建一个case类,而不是手动使用JSON AST。

在你的case类中,你可以有一个Option[String]字段。

代码语言:javascript
复制
case class MyModel( attributeName: Option[String] )
implicit val rw: ReadWriter[MyModel] = macroRW

read[MyModel](jsonString)

但从外观上看,你可以做

代码语言:javascript
复制
json.obj.value.get("attributename").map(_.str)

去拿回一个Option[String]

票数 2
EN

Stack Overflow用户

发布于 2020-05-06 01:23:42

别忘了,json是一个对象。

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

代码语言:javascript
复制
val json = ujson.read(jsonString)
if (json.obj.get("attributename").nonEmpty) {
  json("attributename").str
  ...
}

顺便说一句,你可以像这样得到keySet:

代码语言:javascript
复制
json.obj.keySet
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55061072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档