Scala 的 JSON 库无法正常工作



我有我的Apache Flink程序:

import org.apache.flink.api.scala._
import scala.util.parsing.json._
object numHits extends App {
    val env = ExecutionEnvironment.getExecutionEnvironment
    val data=env.readTextFile("file:///path/to/json/file")
    val j=data.map { x => ("""""+x+""""") }
    /*1*/ println( ((j.first(1).collect())(0)).getClass() )
    /*2*/ println( ((j.first(1).collect())(0)) ) 
    /*3*/ println( JSON.parseFull((j.first(1).collect())(0)) )
    }

我想将输入 JSON 文件解析为正常的 scala Map,为此我使用的是默认的scala.util.parsing.json._库。

第一个 println 语句的输出是 JSON 解析函数所需的class java.lang.String

第二个 println 函数的输出是由 """"" 追加和预置的实际 JSON 字符串,这也是 JSON 解析器所必需的。

现在,如果我复制控制台中打印的第二个println命令的输出并将其传递给JSON.parseFull()函数,它会正确解析它。

因此,第三个println函数应该正确解析传递给它的相同字符串,但它没有,因为它输出一个"None"字符串,这意味着它失败了。

为什么会发生这种情况,我怎样才能让它工作?

第二个 println 函数的输出是附加和前缀为"\"\"\"的实际 JSON 字符串,这也是 JSON 解析器所必需的。

不,当然不是。这将生成一个像 """{}""" 这样的字符串,这不是有效的 JSON,并且被解析器正确拒绝。当你用 Scala 代码编写"""{}"""时,引号不是字符串本身的一部分,它们只是分隔文字:字符串的内容是 {} ,这是有效的 JSON。

你只需要改变

val j=data.map { x => ("""""+x+""""") }

val j=data.map { x => x.replaceAll(""", "\"") }

但是上面的代码不是必需的,因为下面的代码可以工作:

val data=env.readTextFile("file:///path/to/json").flatMap( line => JSON.parseFull(line) )

相关内容

  • 没有找到相关文章

最新更新