Json scala中的铁路超高模式匹配地图[字符串,任意]
我正在尝试将此映射字符串化为json字符串: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"),
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中的类型擦除-上面的例子是最快和最简单的方法