Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json scala中的铁路超高模式匹配地图[字符串,任意]_Json_Scala_Pattern Matching - Fatal编程技术网

Json scala中的铁路超高模式匹配地图[字符串,任意]

Json scala中的铁路超高模式匹配地图[字符串,任意],json,scala,pattern-matching,Json,Scala,Pattern Matching,我正在尝试将此映射字符串化为json字符串: val value = Map( "items" -> Seq( Map( "type" -> Seq("http://data-vocabulary.org/Product"), "properties" -> Map( "brand" -> Seq("Bridgestone"),

我正在尝试将此映射字符串化为json字符串:

val value = Map(
        "items" -> Seq(
            Map(
                "type" -> Seq("http://data-vocabulary.org/Product"),
                "properties" -> Map(
                    "brand" -> Seq("Bridgestone"),
                    "category" -> Seq("Truck Tires"),
                    "name" -> Seq("R-195F"),
                    "photo" -> Seq(""),
                    "price" -> Seq("$300.09"),
                    "url" -> Seq("http://www.bridgestonetrucktires.com")
                )
            )
        )
    )
使用此方法:

    def beautify(map: Map[String, Any]): String = {
    val keys = map.keys.toSeq
    keys.map(key => {
        val value: Any = map.get(key).get
        value match {
            case x: Map[String, Any] => "\"" + key + "\": " + beautify(x)
            case x: Seq[String] => "\"" + key + "\": " + x.mkString("[", ", ", "]")
            case x: Seq[Map[String, Any]] => x.map(el => beautify(el)).mkString("[", ", ", "]")
        }
    }).mkString("{", ", ", "}")
}
问题是,当我获取键“items”并尝试匹配此处的值时:

value match {
            case x: Map[String, Any] => "\"" + key + "\": " + beautify(x)
            case x: Seq[String] => "\"" + key + "\": " + x.mkString("[", ", ", "]")
            case x: Seq[Map[String, Any]] => x.map(el => beautify(el)).mkString("[", ", ", "]")
        }
它与这一行相匹配:

case x: Seq[String] => "\"" + key + "\": " + x.mkString("[", ", ", "]")
而不是这个:

case x: Seq[Map[String, Any]] => x.map(el => beautify(el)).mkString("[", ", ", "]")

非常感谢您的帮助。

您的
案例x:Seq[Map[String,any]]
无法访问,因为它的运行时类型与
案例x:Seq[String]
相同。当您构建程序时,
Seq
中的类型参数将被擦除

有两种方法可以解决这个问题——我会给你最简单的方法。首先,将类包装在case类中:

case class SeqMap(value: Seq[Map[String, Any]])
那么您的值将如下所示:

val value = Map(
  "items" -> SeqMap(
    Seq(Map(
      "type" -> Seq("http://data-vocabulary.org/Product"),
      "properties" -> Map(
        "brand" -> Seq("Bridgestone"),
        "category" -> Seq("Truck Tires"),
        "name" -> Seq("R-195F"),
        "photo" -> Seq(""),
        "price" -> Seq("$300.09"),
        "url" -> Seq("http://www.bridgestonetrucktires.com")
      )
    ))
  )
)
还有,您的新匹配声明:

case x: Map[String, Any] => ...
case x: Seq[String] => ...
case x: SeqMap => ...
而且,即使如此,
Map[String,Any]
Seq[String]
Any中的
String
也由于类型擦除而被忽略。例如,
Seq[String]
Seq[Int]
的运行时类型是相同的

有更多的方法可以克服Scala中的类型擦除-上面的例子是最快和最简单的方法