如何在不干扰 iOS 中键值对序列的情况下读写 json 文件?

Posted

技术标签:

【中文标题】如何在不干扰 iOS 中键值对序列的情况下读写 json 文件?【英文标题】:How to read-write json file without disturbing the sequences of its key-value pairs in iOS? 【发布时间】:2016-08-08 12:48:59 【问题描述】:

我正在序列化一个 json 文件,其键值对在编辑后写入新文件时不应被打乱。即使我不编辑它仍然会洗牌。

我只需要新文件(写入文件)中的键值对序列与我读取的前一个文件中的键值对序列相同。

这里是示例 json

[
 
  "StudentName":"Amit",
  "StudentId":"1" 
 ,
 
 "StudentName":"Lalit",
 "StudentId":"2"
 ,
 
 "StudentName":"Ram",
 "StudentId":"3"
 ,
 
 "StudentName":"Shyam",
 "StudentId":"4"
 
]

将 jsonObject 写入新文件后得到的是:

[
   
  "StudentName":"Lalit",
  "StudentId":"2"
  ,
  
  "StudentName":"Ram",
  "StudentId":"3"
  ,
 
  "StudentName":"Shyam",
  "StudentId":"4"
 ,
 
  "StudentName":"Amit",
  "StudentId":"1"
 
]

我有两个代码文件,因为我正在使用命令行工具。

1)main.swift

  import Foundation

  var behavioralJsonObject : AnyObject
  var newBehavioralDataObject: NSData = NSData()

  let fileManager = NSFileManager.defaultManager()
  var path = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first
  var stringPath: String = (path?.path)!

  var behavioralFilePath: String = stringPath.stringByAppendingString("/BehavioralFile.json")
  var newBehavioralFilePath : String = stringPath.stringByAppendingString("/BehavioralFileNew.json")


  behavioralJsonObject = MyJsonParser().jsonObject(withFilePath: behavioralFilePath)

  print(behavioralJsonObject.description)

  newBehavioralDataObject = try  NSJSONSerialization.dataWithJSONObject(behavioralJsonObject, options: .PrettyPrinted)


   newBehavioralDataObject.writeToFile(newBehavioralFilePath, atomically: true)

2) MyJsonParser.swift

  import Foundation

  class MyJsonParser: NSObject 

  func jsonObject(withFilePath path:String)-> AnyObject
    let dataObject = NSData.init(contentsOfFile: path)
    var jsonObject: AnyObject = []
    do
    jsonObject  = try NSJSONSerialization.JSONObjectWithData(dataObject!, options: .AllowFragments)
    
    catch
        print("Serialization error : \(error)")
    
    return jsonObject;
  


有人已经遇到过这个问题或有解决方案吗?

【问题讨论】:

用相关代码更新您的问题。 我已经添加了代码。 “jsonObject(withFilePath path:String)”方法中的“print(jsonObject.dynamicType”显示什么?只要确保您读取的是数组而不是字典即可。 【参考方案1】:

请重新检查您的代码。如果您的代码是正确的,那么您正在解析 JSON 数组,将其转换回数据,并且不要以正确的顺序写入数组元素。如果确实发生了这种情况,那么您唯一能做的就是向 Apple 发送错误报告并让他们修复它。数组元素有一个定义的顺序;如果通过读取和写入数组的行为改变了这一点,那么某处就有一个严重的错误。

字典不同。字典中的键/值对是无序的。您无法找出它们被解析的顺序,并且它们的写入顺序是未定义的。所以如果你的第一个数组元素写成


   "StudentId":"1" 
   "StudentName":"Amit",
,

这是完全可以预料的,也是完全正确的。然而,改变数组元素的顺序是一个错误。请注意,如果您实际阅读字典并打印出字典的值数组,那将再次以未定义的顺序排列。

【讨论】:

我不能得到非洗牌的字典吗? 如果您依赖于对象内部键的顺序,那么您没有正确使用 JSON,因为它不保证任何顺序(它在规范中特别是无序集合)。跨度> 其实我有一个json,其中包含大约3000多个条目(嵌套),具有适当的标准,并且需要维护该标准。 JSON 的标准是对象内部的键(在您的情况下为 StudentName 和 StudentId)没有确定的顺序。然而,对象在数组中出现的顺序必须保持(所以 Amit 就在 Lalit 之前)。

以上是关于如何在不干扰 iOS 中键值对序列的情况下读写 json 文件?的主要内容,如果未能解决你的问题,请参考以下文章

获取 RocksDB 中键值对的总数

我怎样才能得到firebase中键、值对的计数? [关闭]

spark scala数据帧中键值对的增量值计数

python字典中键值对的值为中文,打印成转义字符,怎么解决

带有python中键值对列表的配置文件

替换对象中键值对的Python函数返回意外输出[重复]