【问题标题】:Enforce order of JSON results强制 JSON 结果的顺序
【发布时间】:2013-06-27 17:02:52
【问题描述】:

我从 json 导入了非常大的结果集。 json 中的每一行数据都返回一个非常具体的“列”顺序,我想快速迭代。我宁愿避免检查/匹配键来处理每条数据的开销。不幸的是,scala.util.parsing.json 将这些列放入一个 Map 对象中,并且在遍历 Map 时,它的迭代顺序是随机的,不一定反映 JSON 结果中列的顺序。有没有办法让解析器强制执行 JSON 列的顺序?一个想法是,是否有办法告诉解析器在生成对象时使用 LinkedHashMap 或 ListMap。这可以通过扩展类或添加其他特征来实现吗?我有其他选择吗?

【问题讨论】:

  • 如果您的问题包括“宁愿避免开销”,您可能希望避免使用scala.util.parsing.json

标签: scala


【解决方案1】:

我强烈建议您不要依赖键/值对的顺序。 JSON 对象是 defined

对象是一组无序的名称/值对。

依赖顺序很可能会给您的代码带来困难的错误和不兼容性。以正确性换取速度总是不好的交易。

相反,我建议找到一个快速、正确的解析器。我之前用过Jackson,速度非常快,可以很好的配合Scala使用。您annotate 是您的任意类,Jackson 将 JSON 解析为该类的实例。然后,您可以将这些实例作为本机 Java/Scala 对象进行处理,这既快速又健壮。

【讨论】:

  • Jackson 是一个基于 Java 的库。有一个叫做 Jerkson 的包装器被 play 使用!一段时间的框架。该项目已被放弃,因此其他库越来越受欢迎。 Json4s 可以得到 Jackson 的支持,所以我建议在 scala 中使用它。
  • jackson 也有一个 scala 模块,它使 java 库与 scala 对象一起工作 -> github.com/FasterXML/jackson-module-scala
【解决方案2】:

我会考虑尝试类似 json4s 的东西。

JObject 类型似乎具有有序字段。

https://github.com/json4s/json4s

否则我会问您为什么需要订购它们? 您始终可以通过键 map.get。

【讨论】:

  • json4s 看起来很有希望,尽管我需要找到一种方法来强制将所有字段都解析为字符串(例如,长字符串不会被解析为双精度)
  • 我正在使用 slick DB 框架,并将这些值转储到准备好的语句中。填充准备好的语句使用数字索引来处理每个变量映射。鉴于我可以为其各自索引的每个键名创建一个查找表,但我宁愿不处理维护此类表的开销,以及在每个结果行上执行该操作的处理能力。
  • 字符串字段在 json 中用双引号括起来。 json4s 会给你正确的类型。
  • 如果您使用 oracle 或 mssql,请小心使用 slick,因为使用 prod 会花费很多钱
  • 不幸的是,我无法控制 json 提要,而且这些数字也没有像应该的那样放入字符串中。通过股票解析,我可以指定 JSON.globalNumberParser = {input : String => input} 以强制所有内容为字符串。可能有办法用 json4s 做到这一点,我可能只需要做更多的研究。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
相关资源
最近更新 更多