0

我正在接收 JSON 文本,将其转换为数据,然后使用 JSONDecoder 创建由 JSON 文本/字符串表示的具体类型。

它确实适用于我的“复杂”数据结构(实现 Codable),甚至是一个简单的 Int 数组,如下所示:

import Foundation

let jsonTextContainigArrayOfInt: String = "[1,2,3]"
let data = jsonTextContainigArrayOfInt.data(using: .utf8)!

do {
    let arrayOfInt: [Int] = try JSONDecoder().decode([Int].self, from: data)
    for n in arrayOfInt {
        print(n)
    }
}
catch {
    print(error)
}

前面的代码可以正常工作并正确创建 Int 数组并打印它们。

使用 JSON 文本中的单个 Int 执行相同方法时会出现问题:

import Foundation

let jsonTextContainigOneInt: String = "1"
let data = jsonTextContainigOneInt.data(using: .utf8)!

do {
    let myInt: Int = try JSONDecoder().decode(Int.self, from: data)
    print(myInt)
}
catch {
    print(error)
}

对于第二种方法,我收到以下错误:

“操作无法完成”

*** 编辑 ***

已存在此错误报告:https ://bugs.swift.org/browse/SR-6163

4

2 回答 2

1

JSONDecoder只能将集合类型(数组或字典)解码为根对象。

在引擎盖下JSONDecoder使用JSONSerialization 没有任何选项。但是,要解码 a StringorInt您必须指定.allowFragments选项。

JSONSerialization.allowFragments选项一起使用

let jsonTextContainingOneString = "1"
let data = Data(jsonTextContainingOneString.utf8)

do {
    let myString = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
    print(myString)
}
catch {
    print(error)
}
于 2018-04-24T16:33:36.657 回答
0

有趣......我发现了这个:

https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/JSONSerialization.swift#L120

特别是这个保护声明:

open class JSONSerialization : NSObject {
        //...

        // top level object must be an Swift.Array or Swift.Dictionary
        guard obj is [Any?] || obj is [String: Any?] else {
            return false
        }

        //...
} 

然后我查看了一个简单的文本字符串是否应该被认为是有效的 JSON,显然它现在应该被认为是(以前不被接受为有效的 JSON)。至少,基于这个出色的答案:https ://stackoverflow.com/a/7487892/8284660

这让我想知道我原来帖子上的行为是否应该是一个错误。

于 2018-04-24T16:09:11.373 回答