我有我的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
语句的输出是class java.lang.String
,这是JSON解析函数所必需的。
第二个println
函数的输出是"\"\"\""
附加和预先附加的实际JSON字符串,这也是JSON解析器所需的。
现在,如果我复制控制台中打印的第二个println
命令的输出并将其传递给JSON.parseFull()
函数,它就会正确解析它。
因此,第三个println
函数应该正确地解析传递给它的相同字符串,但它不会输出“None”字符串,这意味着它失败了。
为什么会发生这种情况?如何才能使其发挥作用?
答案 0 :(得分:2)
第二个println函数的输出是" \" \" \""附加和预先附加的实际JSON字符串。这也是JSON解析器所必需的。
不,当然不是。这会产生一个像"""{}"""
这样的字符串,它不是有效的JSON,并且被解析器正确拒绝。当您在Scala代码中编写"""{}"""
时,引号不是字符串本身的一部分,它们只是界定字面值:字符串的内容是{}
,这是有效的JSON。
答案 1 :(得分:0)
你必须改变
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) )