2011-01-21 35 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

相關問題