Scala 在播放json时,有没有办法读取键/值映射,记住原始顺序?

Scala 在播放json时,有没有办法读取键/值映射,记住原始顺序?,scala,play-json,Scala,Play Json,鉴于: 在Scala中,有没有一种方法可以读取字符串->对象的JSON映射fruits,同时记住键的顺序最初是苹果、香蕉、樱桃。。。西瓜 [下面添加,因为有人问我为什么要这样做,并提供了一个测试示例] 通常我不在乎(地图的)顺序。我不控制输入的格式;它是一个映射,而不是数组。真正的输入不是水果,而是带有字母数字键的警报,我只是简单地选择了水果名称。我正在根据数据构建测试文件。假设第一个文件中有十个项目,我从第二个文件中删除了“西瓜”(第十个对象)。读取第一个文件的代码将对象放入数据库。当它处理对

鉴于:

在Scala中,有没有一种方法可以读取字符串->对象的JSON映射
fruits
,同时记住键的顺序最初是苹果、香蕉、樱桃。。。西瓜

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

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

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

播放JSON(至少2.6.9)从上到下解析js对象,将所有字段收集到
内容:ListBuffer[(字符串,JsValue)]
。解析对象中的所有字段后,通过
apply
方法实例化
JsObject

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

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

您为什么关心订单?@TomerShetah这是为了我的测试。我从真实数据构建测试文件。此特定数据使用映射而不是数组。我在构建场景时删除/编辑对象。我知道我修改了哪些对象(它们在文件中的位置)。在构建预期的事件ID和结果对时,我需要预测DB中的事件ID是什么。事件ID与数据库插入顺序有关。您可以添加一个示例测试吗?播放JSON 2.6开始变老,最新的是2。9@cchantep目前使用的是2.7.4。我使用的是地图的默认读取。我得到的是一个HashTrieMap,元素看起来是无序的。
Map
没有顺序假设。无论如何,您的测试可以轻松地执行
toSortedMap
来强制执行键顺序(即使大多数测试框架能够无序地比较,并且在JSON repr中没有意义/保证的顺序)。@cchantep,即使在2.9.1中,我们也有以下``private[JSON]def createFieldsMap(fields:Iterable[(String,JsValue)]=Seq.empty):mutable.Map[String,JsValue]={import scala.collection.JavaConverters.\unew java.util.LinkedHashMap[String,JsValue]().asScala++=fields}def apply(fields:collection.Seq[(String,JsValue)]:JsObject=new JsObject(createFieldsMap(fields))``事实上
JMapWrapperLike
使用底层java映射
def apply(fields: Seq[(String, JsValue)]): JsObject = new JsObject(mutable.LinkedHashMap(fields: _*))