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

发布于 2024-10-13 09:24:48 字数 2353 浏览 2 评论 0原文

我正在编写一个简单的 scala 应用程序,它打开一个 json 数据的平面文件,解析它,最后将其打印到屏幕上。

下一步将要求我在每个对象处停止并在其前面添加另一个项目(字符串)。我的问题是如何在此列表中为每个对象添加新字符串?

以下是我的 JSON 实现(归功于 init 作者 此处)

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 。相反,我想向此解析方法传递一个 String 并让它附加它,或者创建一个新的 json 对象,该对象在

Update

内每个对象的前面都有该字符串我当前的尝试如下所示

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[Map[String, Any]]) println(parseAll(value, reader).map(addHeader(_.asInstanceOf[Map[String, Any]], header)))

AND

错误:方法 addHeader 的参数不足:(xyz: Map[String,Any],header :(字符串,任意))地图[字符串,任意]。 未指定值参数标头。 case (k, m:Map[String, Any]) =>; (k, addHeader(m))

任何帮助将不胜感激(提前感谢您!)

I'm writing a simple scala application that opens a flat file of json data, parses it and finally prints it out to the screen.

The next step will require that I stop at each object and add another item (string) to the front of it. My question is how can I add a new string per object in this list?

The following is my JSON implementation (credit goes to the init author 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)
                )
}

Next I call this w/ a flat file like so

import java.io.FileReader
import scala23.JSON

class JSONTest extends JSON {
        def main(args: String) {
                val reader = new FileReader(args)
                println(parseAll(value, reader))
        }
}

Then I get a valid println of the json contents. Instead I would like to pass this parse method a String and have it append it or create a new json object that has the string at the front of each object inside

Update

My current attempt looks something like the below

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

But I'm currently getting a few errors in Intellij

error: missing parameter type for expanded function ((x$1) => x$1.asInstanceOf[Map[String, Any]])
println(parseAll(value, reader).map(addHeader(_.asInstanceOf[Map[String, Any]], header)))

AND

error: not enough arguments for method addHeader: (xyz: Map[String,Any],header: (String, Any))Map[String,Any].
Unspecified value parameter header.
case (k, m:Map[String, Any]) => (k, addHeader(m))

Any help would be much appreciated (thank you in advance!)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

与酒说心事 2024-10-20 09:24:48

您是否尝试过在解析器输出上使用 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
  }
}

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

Have you tried using map on the parser output instead.

Edit: this compiles on my machine

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

It should be handling the varied output of the parse better.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文