繁体   English   中英

在 play-json 中有没有办法读取键/值映射,记住原始顺序?

[英]Is there a way in play-json to read a key/value map, remembering the original ordering?

鉴于:

{
  ...
  "fruits": {
    "apple": { ... },
    "banana": { ... },
    "cherry": { ... },
    ...
    "watermelon": { ... }
  }
}

有没有在斯卡拉的方式来阅读本JSON地图fruits字符串- >对象,同时记住按键的顺序原是苹果,香蕉,樱桃...西瓜?

[下面添加是因为有人问我为什么想要这个并提供一个测试示例]

通常我不会关心(地图的)排序。 我不控制输入的格式; 它是一个地图,而不是一个数组。 真正的输入不是水果,而是带有字母数字键的警报,为了简单起见,我只是选择了水果名称。 我正在根据数据构建测试文件。 假设第一个文件中有十个项目,我从第二个文件中删除了“西瓜”(第 10 个对象)。 读取第一个文件的代码将对象放入数据库。 当它处理对象(警报)时,每个对象都会产生一个动作。 测试结果是EventAction(id:Long,action:String) id是来自数据库的自动增量 Long; 我不控制。 处理完第一个文件后,发现与“西瓜”相关联的警报创建时的 ID 为 2,而不是 10。当我为处理第二个文件(没有“西瓜”的文件)构建测试时,如果我认为 id 将是 10,则测试将失败不是因为我错误地预测了action ,而是因为我不知道id是 2 而不是 10。

处理 Map 的一种方法(“你不应该关心排序,所以你不会得到任何关于 JSON 文件中原始排序的线索”)是我可以构建临时SQL 来找出数据库id是什么为每个键创建,仅用于测试。 在我编写临时SQL(公司通常要求所有 DB 交互都通过 DBA 编写的存储过程)之前,我想,“在阅读 JSON 时,记住在在那一刻,在它消失之前。”

Play-json(至少 2.6.9)从上到下解析 js 对象,收集所有字段到content: ListBuffer[(String, JsValue)] 当对象中的所有字段都解析JsObject ,再通过apply方法实例化JsObject

def apply(fields: Seq[(String, JsValue)]): JsObject = new JsObject(mutable.LinkedHashMap(fields: _*))

因此,您的问题的答案是:如果您使用库中默认的Reads for Map ,则已经保留了顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM