我正在编写一个简单的scala应用程序,该应用程序打开json数据的平面文件,对其进行解析并最终将其打印到屏幕上。如何在scala中为每个对象添加额外的json项目
下一步将要求我停在每个对象上并在其前面添加另一个项目(字符串)。我的问题是如何在这个列表中添加每个对象的新字符串?
以下是我的JSON实现(幸得INIT笔者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)
)
}
下一个我称之为W/A平面文件,像这样
import java.io.FileReader
import scala23.JSON
class JSONTest extends JSON {
def main(args: String) {
val reader = new FileReader(args)
println(parseAll(value, reader))
}
}
然后我得到一个有效的println的json内容。相反,我想通过这个解析方法的字符串,并将它添加它,或者创建具有在每个对象的内部
更新
我现在尝试前面的字符串的新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)=> X $ 1.asInstanceOf [地图[字符串,任何]]) 的println(parseAll(值,读取器).MAP(的addHeader(_ asInstanceOf [地图[字符串,任何],报头)。))
AND
错误:不够论据方法addHeader:(xyz:Map [String,Any],header:(String,Any))Map [String,Any]。 未指定的值参数标头。 情况下(K,M:地图[字符串,任何])=>(K,的addHeader(M))
任何帮助将非常感激(感谢你在前进!)
您能否为addHeader方法提供完整的工作语法。当前标志不正确(intellij显示错误:类型Map需要类型参数) – JimmyBond 2011-01-21 20:15:57