0

如果您可以提供一个简单的模板,我愿意使用不同的库。我更喜欢我解析的 JSON 的嵌套地图输出。谢谢!

相关代码:

import scala.util.parsing.json.JSON
...
input = [Some file read in; see bottom for result]
val parsed = JSON.parseFull(input)
val parsedMap = (parsed.toList)(0)
println(parsedMap)
println(parsedMap.getClass())
println(parsedMap.keys)

结果,包括底部的错误:

地图(交互 -> 地图(作者 -> 地图(名称 -> iBuyCell,头像 -> http://a0.twimg.com/profile_images/1751023331/SellingYourCell1_normal.png,用户名 -> iBuyCell,id -> 4.62459933E8,链接-> http://twitter.com/iBuyCell ),来源 -> twitterfeed,id -> 1e17bc84c345a800e0742ed998fff162,链接 -> http://twitter.com/iBuyCell/statuses/186347162957918208,内容 -> 电话禁令对警方提出挑战:上周,教堂山成为该州和全国唯一一个... http://t.co/xVCQMDU7, created_at -> Sun, 01 Apr 2012 07:00:00 +0000, type -> twitter), links -> Map(created_at -> List(Sun, 01 Apr 2012 04:22:36 +0000), retweet_count -> List(3.0), title -> List(电话禁令对警察提出挑战 - Orange County - NewsObserver.com), url -> List(http://www.newsobserver.com/2012/04/01/1970433/police- challenged-by-cell-phone.html)), 显着性 -> Map(content -> Map(sentiment -> -1.0)), language -> Map(tag -> en), raw_links -> List(http:// bit.ly/HwmJa6), twitter -> Map(source -> twitterfeed, domain -> List(bit.ly), text -> 电话禁令给警察带来挑战:Chapel Hill 上周成为该州和全国唯一的城镇到 p... http://t.co/xVCQMDU7, 链接 -> 列表 (http://bit.ly/HwmJa6), id -> 186347162957918208, created_at -> Sun, 01 Apr 2012 07:00:00 +0000, user -> Map(utc_offset -> -14400.0, name -> iBuyCell, screen_name -> iBuyCell, location -> Text (Bez) Buy Kyts, url -> http://way.to/FreeFones , description -> Need Cash FAST? 给我们发短信 24 小时快速报价!时间,如果您需要一部新的免费手机,可选择运营商和样式,请点击下面的网站!,id_str -> 462459933,listed_count -> 1.0,followers_count -> 178.0,id -> 4.62459933E8,created_at -> Thu, 2012 年 1 月 12 日 23:58:34 +0000, lang -> en, time_zone -> Atlantic Time (Canada), statuses_count -> 13069.0)))

类 scala.collection.immutable.HashMap$HashTrieMap

错误:值键不是任何 println(parsedMap.keys) 的成员

如果有帮助,这是有问题的原始 JSON:

教堂山上周成为该州和全国唯一一个... http://t.co/xVCQMDU7","user":{"created_at":"Thu, 12 Jan 2012 23:58:34 + 0000","description":"需要快速现金吗?24小时发短信给我们快速报价!同时,如果您需要一部新的免费手机,可选择运营商和款式,请点击以下网站!","followers_count":178,"id":462459933,"id_str":"462459933","lang ":"en","listed_count":1,"location":"Text (Bez) Buy Kyts","name":"iBuyCell","screen_name":"iBuyCell","statuses_count":13069,"time_zone" :"大西洋时间 (加拿大)","url":"http://way.to/FreeFones","

4

2 回答 2

0

我复制了您的示例 JSON 并使用它来初始化String然后传递给scala.util.parsing.json.JSON.parseFull. 结果是Option[Any],正如所宣传的那样。然后你使用toListOption[Any](在这种情况下实际上是 a Some)并得到一个元素List[Any](如果它是 a None,你会得到一个 empty List)。然后,您选择该 的第一个(也是唯一的)元素List,产生一个Any.

在这一点上,有了一个Any在手(可以是任何东西,呃......),您只能调用在 type 上定义的那些方法Any。那当然不包括keys

正如 Martin Blech 所说明的,您可以通过模式匹配进行此操作的一种方法。这种case子句有效地结合了isInstanceOf[Type](type test) 和asInstanceOf[Type](cast) 给你一个静态承载 type 的值Map[String, Any]。那时,您使用类似keysor的方法keySet(以及为 定义的所有其他方法Map)。

最后请注意,由于 JVM 的类型擦除,case所讨论的值与所有其他类型无法区分,因此您将收到未经检查的类型警告。Map

于 2013-01-18T04:05:02.563 回答
0

文档parseFull返回一个Option[Any]包含 anArray[Any]或 a的 an Map[String, Any]。如果您确定要解析 JSON 对象而不是数组,则一种方法是:

JSON.parseFull(input).get match {
  case map: Map[String, Any] => {
    // do anything you have to do with the map here, e.g.:
    println(map.keys)
  }
}
于 2013-01-18T03:31:15.330 回答