在iOS中,如何在不干扰其键值对序列的情况下读写json文件?
我正在序列化一个json文件,在编辑后写入一个新文件时,其键值对不应被洗牌。即使我不编辑它仍然会洗牌对 我只需要在新文件(已写入文件)中使用与我读取的前一个文件中相同的键值对序列 下面是示例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" }, {
[
{
"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之前)。