Scala的JSON库无法正常工作

时间:2016-04-27 10:05:40

标签: java json scala parsing apache-flink

我有我的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”字符串,这意味着它失败了。

为什么会发生这种情况?如何才能使其发挥作用?

2 个答案:

答案 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) )