2011-01-21 82 views
1

我正在编写一个简单的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))

任何帮助将非常感激(感谢你在前进!)

回答

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 
    } 
} 

应该处理解析的不同的输出更好的。

+0

您能否为addHeader方法提供完整的工作语法。当前标志不正确(intellij显示错误:类型Map需要类型参数) – JimmyBond 2011-01-21 20:15:57

相关问题