当前位置: 首页 > 面试题库 >

Swift 3中的JSON解析

燕禄
2023-03-14
问题内容

有没有人能够找到一种在Swift
3中解析JSON文件的方法?我已经能够获得返回的数据,但是在将数据分解为特定字段方面我没有成功。我会发布示例代码,但是我经历了很多不同的方法,但是都没有成功。我想解析的基本格式是这样的。提前致谢。

{
  "Language": {

    "Field":[
          {
          "Number":"976",
          "Name":"Test"
          },
          {
          "Number":"977",
          "Name":"Test"
          }
       ]
   }
}

问题答案:

你试过了JSONSerialization.jsonObject(with:options:)吗?

var jsonString = "{" +
    "\"Language\": {" +
    "\"Field\":[" +
    "{" +
    "\"Number\":\"976\"," +
    "\"Name\":\"Test\"" +
    "}," +
    "{" +
    "\"Number\":\"977\"," +
    "\"Name\":\"Test\"" +
    "}" +
    "]" +
    "}" +
    "}"

var data = jsonString.data(using: .utf8)!

let json = try? JSONSerialization.jsonObject(with: data)

Swift有时会产生一些非常奇怪的语法。

if let number = json?["Language"]??["Field"]??[0]?["Number"] as? String {
    print(number)
}

JSON对象层次结构中的所有内容最终都被包装为可选(即AnyObject?)。Array<T>下标返回一个非可选的T。对于此JSON(包装在可选的数组下标中),返回Optional<AnyObject>。但是,Dictionary<K, V>下标返回Optional<V>。对于此JSON,下标返回非常奇怪的外观
Optional<Optional<AnyObject>>(即AnyObject??)。

  • json是一个Optional<AnyObject>
  • json?["Language"]返回Optional<Optional<AnyObject>>
  • json?["Language"]??["Field"]返回Optional<Optional<AnyObject>>
  • json?["Language"]??["Field"]??[0]返回Optional<AnyObject>
  • json?["Language"]??["Field"]??[0]?["Number"]返回Optional<Optional<AnyObject>>
  • json?["Language"]??["Field"]??[0]?["Number"] as? String返回Optional<String>

Optional<String>,然后由使用if let语法产物String

最后说明:迭代字段数组如下所示。

for field in json?["Language"]??["Field"] as? [AnyObject] ?? [] {
    if let number = field["Number"] as? String {
        print(number)
    }
}

Swift 4更新

Swift 4使这一切变得更容易处理。再次,我们将从您的测试数据开始("""使它变得更好)。

let data = """
{
  "Language": {

    "Field":[
          {
          "Number":"976",
          "Name":"Test"
          },
          {
          "Number":"977",
          "Name":"Test"
          }
       ]
   }
}
""".data(using: .utf8)!

接下来,我们可以围绕JSON中使用的对象定义类。

struct Object: Decodable {
    let language: Language
    enum CodingKeys: String, CodingKey { case language="Language" }
}

struct Language: Decodable {
    let fields: [Field]
    enum CodingKeys: String, CodingKey { case fields="Field" }
}

struct Field: Decodable {
    let number: String
    let name: String
    enum CodingKeys: String, CodingKey { case number="Number"; case name="Name" }
}

CodingKeys枚举是结构特性如何映射到JSON对象构件字符串。该映射由来自动完成Decodable

现在解析JSON很简单。

let object = try! JSONDecoder().decode(Object.self, from: data)

print(object.language.fields[0].name)

for field in object.language.fields {
    print(field.number)
}


 类似资料:
  • 我试图获取一个JSON响应,并将结果存储在一个变量中。我在以前的Swift版本中使用过这个代码版本,直到Xcode8的GM版本发布。我在StackOverflow上看了几篇类似的文章:Swift 2 Parsing JSON-Cant下标类型为“anyObject”的值和Swift 3中的JSON Parsing。 然而,这里所传达的思想似乎不适用于这种情况。 如何正确解析Swift3中的JSON

  • 我得到以下错误 响应数据为空。我做错了什么,或者我在代码中遗漏了什么?

  • 我的项目运行得很好,但当我添加alamofire时,它就不起作用了。 它给出以下错误 ld:警告:未找到选项“-F/Users/banglafire/Desktop/mysios/Build/Products/Debug iphonesimulator/Alamofire”的目录ld:未找到框架Alamofire clang:错误:链接器命令失败,退出代码为1(使用-v查看调用) 附加信息 Coc

  • 为什么这在《雨燕3》中行不通?它会在运行时崩溃,并表示: “-[MY_APP_NAME.DisplayOtherappSCTRL TAP:]:无法识别的选择器已发送到实例0x17ECEB70”

  • 问题内容: 我正在尝试存储从以下请求中获取的JSON中的JSON … 得到的JSON从获得 的身体 是下面的,正如你可以看到有是JSON内的JSON,我怎么能存储 的是 JSON在 NSDictionary中 ,你可以看到,JSON是引号之间。 问题答案: 实际上,您拥有的是:经典JSON,其中有一个字符串“代表” JSON。 因此,由于我们可以这样做: NSData <=> NSString N

  • 问题内容: 我在Android的JSON解析中进行了很多搜索,但并不太确定。关于JSON解析,实际上有一个简短的想法,但还不清楚。 如何在应用程序中实现JSON解析? 问题答案: 这是一个非常简单的JSON字符串 为了得到它的值,使用像这样: 这是一个稍微复杂的json字符串 为了从此用途中提取值 希望这个对你有帮助...........

  • 我想订阅一个主题后成功连接,但我不能这样做。我已经试过了EG.starscream(仅适用于WebSocket连接)、StompClient、ActionCableClient、FayeSwift等的所有库,但似乎都不起作用。我想连接并订阅Stomp客户端WebSocket,请给我推荐一些可以连接并订阅Stomp客户端的WebSocket库。

  • 问题内容: 示例A:-这会导致应用崩溃。 范例B:-但事实并非如此 据我所知 x.sync表示在主线程/ UI线程中执行操作,x.async表示在后台线程中执行操作。 全局意味着用并发队列执行某些任务,即并行任务。 任务1:-为什么在后台线程(即main.async)中执行任务时,我的应用程序崩溃了,而不是调用主线程来更新UI。 任务2:-main.async和global()。async是否有任