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

时间:2016-04-16 15:16:57

标签: ios json nsjsonserialization jsonserializer

我正在序列化一个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;
  }

}

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

1 个答案:

答案 0 :(得分:0)

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

与词典不同。字典中的键/值对是无序的。您无法找到它们被解析的顺序,并且它们的编写顺序是不确定的。因此,如果您的第一个数组元素被写为

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

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