Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala upickle/ujson中JSON null的惯用处理_Scala_Ujson_Upickle - Fatal编程技术网

scala upickle/ujson中JSON null的惯用处理

scala upickle/ujson中JSON null的惯用处理,scala,ujson,upickle,Scala,Ujson,Upickle,我是Scala新手,希望学习解决常见问题的惯用方法,如pythonic for Python。我的问题涉及使用读取JSON数据,其中JSON值存在时包含字符串,不存在时包含null。我想使用自定义值替换null。一个简单的例子: import upickle.default._ val jsonString = """[{"always": "foo", "sometimes": "bar&qu

我是Scala新手,希望学习解决常见问题的惯用方法,如pythonic for Python。我的问题涉及使用读取JSON数据,其中JSON值存在时包含字符串,不存在时包含null。我想使用自定义值替换null。一个简单的例子:

import upickle.default._

val jsonString = """[{"always": "foo", "sometimes": "bar"}, {"always": "baz", "sometimes": null}]"""
val jsonData = ujson.read(jsonString)

for (m <- jsonData.arr) {
  println(m("always").str.length)  // this will work
  println(m("sometimes").str.length)  // this will fail, Exception in thread "main" ujson.Value$InvalidData: Expected ujson.Str (data: null)
}
鉴于Scala简洁的语法,这看起来有点复杂,并且在对许多值执行时会重复

创意2 关于创建具有默认值的案例类的问题的答案。对于我的问题,当根据上下文需要不同的替换值时,case类的创建对我来说似乎是不灵活的

创意3 讨论如何使用
Try().getOrElse()
,即:

import scala.util.Try
// ...
println(Try(m("sometimes").str).getOrElse("DEFAULT").length)
然而,讨论中提到,为常规程序路径抛出异常代价高昂


解决这个问题的惯用而又简洁的方法是什么?

惯用还是scala使用scala的

幸运的是,upickle值提供了它们。参考源代码中的strOpt方法

代码中的问题是m(“始终”).str和m(“有时”).str中的str方法 在这段代码中,您过早地假设所有的值都是字符串。这就是strOpt方法的由来。如果值是字符串,则输出字符串;如果值不是字符串,则输出无类型。我们可以使用getOrElse方法结合它来决定如果值为None时抛出什么

以下是处理此问题的最佳方法

val jsonString = """[{"always": "foo", "sometimes": "bar"}, {"always": "baz", "sometimes": null}]"""

for (m <- jsonData.arr) {
    println(m("always").strOpt.getOrElse("").length)  
    println(m("sometimes").strOpt.getOrElse("").length) 
  } 
在这里,如果我们得到字符串以外的任何值(null、float、int),代码将以空字符串的形式输出它。其长度将计算为0


基本上,这类似于您的“Idea1”方法,但这是scala方法。我抛出的不是“DEFAULT”,而是一个空字符串,因为您不希望null值的长度为7(字符串的长度为“DEFAULT”)。

感谢Nihad提供的有用且信息丰富的答案,并指向实际的源代码!
val jsonString = """[{"always": "foo", "sometimes": "bar"}, {"always": "baz", "sometimes": null}]"""

for (m <- jsonData.arr) {
    println(m("always").strOpt.getOrElse("").length)  
    println(m("sometimes").strOpt.getOrElse("").length) 
  } 
3
3
3
0