2013-06-27 68 views
2

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

+1

如果您的问题中包含“宁愿避免开销”一词,您可能希望避免使用'scala.util.parsing.json'。 –

回答

1

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

看来JObject类型已经排序了字段。

https://github.com/json4s/json4s

否则我会问,为什么你需要他们定购? 您可以随时使用map.get按键。

+0

json4s看起来像它可能是有希望的,但我需要找到一种方法来强制所有字段被解析为字符串(例如长字符串的数字不会被解析为双) –

+0

我使用的是光滑的DB框架,并且将这些价值观倾倒在准备好的声明中。填充预准备语句使用数字索引来处理每个变量映射。鉴于我可以为每个键名创建一个查找表给它各自的索引,但我宁愿不处理维护这样一个表的开销,以及在每个结果行上执行该操作的处理能力。 –

+0

字符串字段包含在json中的双引号中。 json4s会给你正确的类型。 – JasonG

2

我强烈建议您不要依赖键/值对的顺序。 JSON对象为defined,如下所示:

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

依靠订单很可能会引入难以解决的错误和代码不兼容。交易对速度的正确性总是一件坏事。

相反,我会建议找到一个快速,正确的解析器。我以前使用过Jackson,这非常快,可以很好地与Scala一起使用。你annotate你的任意类和杰克逊解析JSON到类的实例。然后,您可以将这些实例作为本机Java/Scala对象来处理,这些对象都非常快速并且非常健壮。

+0

Jackson是一个基于Java的库。有一个名叫Jerkson的包装纸,被玩家使用!框架一段时间。尽管其他图书馆越来越受欢迎,但该项目已被放弃。 Json4s可以得到杰克逊的支持,所以我建议在scala中使用它。 – JasonG

+0

jackson还有一个scala模块,它可以使java库与scala对象一起工作 - > https://github.com/FasterXML/jackson-module-scala –