Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法将排序字典序列化为JSON-Swift 3_Ios_Json_Swift_Dictionary_Foundation - Fatal编程技术网

Ios 无法将排序字典序列化为JSON-Swift 3

Ios 无法将排序字典序列化为JSON-Swift 3,ios,json,swift,dictionary,foundation,Ios,Json,Swift,Dictionary,Foundation,无法通过JSONSerialization.data(withJSONObject:options:)将我的已排序字典序列化为JSON 序列化可用于未排序的字典,但排序后的应用程序会抛出错误,说明如下: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (_SwiftValue)' 我的方法是这样的: func creat

无法通过
JSONSerialization.data(withJSONObject:options:)将我的已排序字典序列化为JSON

序列化可用于未排序的字典,但排序后的应用程序会抛出错误,说明如下:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (_SwiftValue)'
我的方法是这样的:

func createJSONFile(){
    // create path to json file
    let fileManager = FileManager.default
    let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
    let documentDirectory = urls[0] as NSURL
    guard let jsonURL = documentDirectory.appendingPathComponent("graphData") else {
        print("Failed to create path to json file.")
        return
    }

    print(jsonURL.absoluteString)
    // creating a .json file in the Documents folder
    if !fileManager.fileExists(atPath: jsonURL.absoluteString){
      fileManager.createFile(atPath: jsonURL.absoluteString, contents: nil, attributes: nil)
        print("file created")
    }

    do {
        let unsortedDic = self.tempDictionaryForJsonFile
        let sortedDic = unsortedDic.sorted(by: <)
        let jsonData = try JSONSerialization.data(withJSONObject: sortedDic, options: .prettyPrinted)
        print(jsonData)
        try jsonData.write(to: jsonURL)

        print(fileManager.fileExists(atPath: jsonURL.absoluteString))

        let content = try String.init(contentsOf: jsonURL, encoding: .utf8)
        print(content)

    } catch {
        print(error.localizedDescription)
    }
}
func createJSONFile(){
//创建json文件的路径
让fileManager=fileManager.default
让URL=fileManager.URL(对于:.documentDirectory,在:.userDomainMask中)
将documentDirectory=URL[0]设为NSURL
guard let jsonURL=documentDirectory.appendingPathComponent(“graphData”)else{
打印(“未能创建json文件的路径”)
返回
}
打印(jsonURL.absoluteString)
//在Documents文件夹中创建.json文件
如果!fileManager.fileExists(atPath:jsonURL.absoluteString){
fileManager.createFile(atPath:jsonURL.absoluteString,内容:nil,属性:nil)
打印(“已创建文件”)
}
做{
让unsortedDic=self.tempDictionaryForJsonFile

让sortedDic=unsortedDic.sorted(按:首先,Swift stdlib中没有已排序的目录(或JSON中没有已排序的目录;JSON对象是无序的)。在字典上调用
.sorted()
时,它返回一个键/值对数组
[(键,值)]

JSONSerialization
有关于它可以序列化什么的规则:

  • 顶级对象是NSArray或NSDictionary

  • 所有对象都是NSString、NSNumber、NSArray、NSDictionary或NSNull的实例

  • 所有字典键都是NSString的实例

  • 数字不是NaN或无穷大

从与NS兼容的集合到它们的NS等价集合之间存在隐式桥接,但只有当内容可以用ObjC表示时(并且
(Key,Value)
不能用ObjC表示),才能得到这种桥接


如何正确地实现这一点在很大程度上取决于
tempDictionaryForJsonFile
的类型和内容,这里没有给出这些内容。这还取决于您试图使用“排序字典”(JSON中不存在,因此无法从Swift获得)实现什么“一个JSON对象的有序数组,每个对象都有一个键/值”,可以构建(但在任何使用此数据的情况下都需要支持它)使用.enumerate数组并构造一个字典,其中键是转换为字符串的[Float]数组的索引,值是也转换为字符串的数组各自的值。最后,结果表明此输出字典具有无序键。“最后,结果表明此输出字典具有无序键。”。“正确。所有Swift字典都有无序键(JSON对象也有无序键)。这是一个问题吗?不清楚为什么要将这些数字转换为字符串;这非常奇怪且容易出错(如果要排序,则无法正确排序)。这似乎非常复杂。如果您有
[Float]
已经,为什么不序列化它呢?或者
[Record]
,其中
Record
将有采样时间,X和Y浮动?感谢您的友好回答。在您发布它之前,我已经设法将图形数据序列化到[[String:Float]]数组,其中String是Y值(Float)的索引因此,我有一个JSON文件,其内容如下:[{“index”:value},{“index”:value…}。这是面试测试任务的一部分。