我正在编写一个简单的scala应用程序,它打开一个json数据的平面文件,解析它,最后将其打印到屏幕上。
下一步将要求我停在每个对象上并在其前面添加另一个项目(字符串)。我的问题是如何在此列表中为每个对象添加一个新字符串?
以下是我的JSON实现(归功于初始作者here)
import scala.util.parsing.combinator._
class JSON extends JavaTokenParsers {
def obj: Parser[Map[String, Any]] =
"{"~> repsep(member, ",") <~"}" ^^ (Map() ++ _)
def arr: Parser[List[Any]] =
"["~> repsep(value, ",") <~"]"
def member: Parser[(String, Any)] =
stringLiteral~":"~value ^^
{ case name~":"~value => (name, value) }
def value: Parser[Any] = (
obj
| arr
| stringLiteral
| floatingPointNumber ^^ (_.toInt)
| "null" ^^ (x => null)
| "true" ^^ (x => true)
| "false" ^^ (x => false)
)
}
接下来我用这样的平面文件调用这个
import java.io.FileReader
import scala23.JSON
class JSONTest extends JSON {
def main(args: String) {
val reader = new FileReader(args)
println(parseAll(value, reader))
}
}
然后我得到了json内容的有效println。相反,我想传递这个解析方法一个字符串并让它附加它或创建一个新的json对象,其中包含每个对象前面的字符串
更新
我目前的尝试类似于下面的
class JSONTest extends JSON {
def main(args: String) {
val reader = new FileReader(args)
val header = ("abc", "def")
// println(parseAll(value, reader).map(addHeader(_, header)))
println(parseAll(value, reader).map(addHeader(_.asInstanceOf[Map[String, Any]], header)))
}
def addHeader(xyz:Map[String, Any], header:(String, Any)):Map[String, Any] = {
xyz.map {
case (k, m:Map[String, Any]) => (k, addHeader(m))
case e => e
} + header
}
}
但我目前在Intellij中遇到一些错误
错误:缺少扩展函数的参数类型((x $ 1)=&gt; x $ 1.asInstanceOf [Map [String,Any]]) println(parseAll(value,reader).map(addHeader(_。asInstanceOf [Map [String,Any]],header)))
AND
错误:方法addHeader的参数不够:(xyz:Map [String,Any],header:(String,Any))Map [String,Any]。 未指定的值参数标题。 case(k,m:Map [String,Any])=&gt; (k,addHeader(m))
非常感谢任何帮助(提前谢谢!)
答案 0 :(得分:0)
您是否尝试过在解析器输出上使用map
。
编辑:这会在我的机器上编译
import java.io.FileReader
import scala23.JSON
class JSONTest extends JSON {
def main(args: String) {
val reader = new FileReader(args)
val header = ("abc", "def")
// println(parseAll(value, reader).map(addHeader(_, header)))
println(parseAll(value, reader).map(addHeader(_, header)))
}
def addHeader(xyz:Any, header:(String, Any)):Any = xyz match {
case obj:Map[String, Any] => obj.map {
case (k, m:Map[String, Any]) => (k, addHeader(m, header))
case e => e
} + header
case arr:List[Any] => arr.map(addHeader(_, header))
case e => e
}
}
应该更好地处理解析的各种输出。