我有我的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) )