如何在不干扰 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章