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

在iOS中,如何在不干扰其键值对序列的情况下读写json文件?,ios,json,nsjsonserialization,jsonserializer,Ios,Json,Nsjsonserialization,Jsonserializer,我正在序列化一个json文件,在编辑后写入一个新文件时,其键值对不应被洗牌。即使我不编辑它仍然会洗牌对 我只需要在新文件(已写入文件)中使用与我读取的前一个文件中相同的键值对序列 下面是示例json [ { "StudentName":"Amit", "StudentId":"1" }, { "StudentName":"Lalit", "StudentId":"2" }, { "StudentName":"Ram", "StudentId":"3" }, {

我正在序列化一个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) 梅因·斯威夫特

  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;
  }

}

是否有人已经遇到此问题或有解决方案?

请重新检查您的代码。如果您的代码是正确的,那么您正在解析JSON数组,将其转换回数据,并且没有按照正确的顺序写入数组元素。如果这真的发生了,那么你唯一能做的就是向苹果发送一份bug报告,让他们修复它。数组元素具有定义的顺序;如果读写数组的行为改变了这一点,那么在某个地方就有一个严重的bug

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

{
   "StudentId":"1" 
   "StudentName":"Amit",
},

这完全是意料之中的,也是完全正确的。但是,更改数组元素的顺序是一个错误。请注意,如果您实际阅读了一本字典并打印出了字典的值数组,那么这也将是未定义的顺序

用相关代码更新您的问题。我已经添加了代码。“jsonObject(withFilePath:String)”中的“print(jsonObject.dynamicType)”是什么意思方法显示?只是确保您在数组中读取而不是在字典中读取。我不能以非无序方式获取字典吗?如果您依赖于对象中键的顺序,那么您就没有正确使用JSON,因为它不能保证任何顺序(在规范中它是无序集合)。实际上,我有一个json,它包含大约3000多个条目(嵌套),有一个适当的标准,需要维护该标准。json的标准是对象内部的键(在您的示例中是StudentName和StudentId)没有确定的顺序。但是,必须保持对象在数组中的显示顺序(因此Amit正好位于Lalit之前)。