如何在scala中为每个对象添加一个额外的json项

时间:2011-01-21 15:04:46

标签: json scala

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

非常感谢任何帮助(提前谢谢!)

1 个答案:

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

应该更好地处理解析的各种输出。