将JSON对象映射到Swift类/结构

10 json swift

我需要"复制"从JSON中的远程Web API服务返回的entiry.它看起来像这样:

{
  "field1": "some_id",
  "entity_name" = "Entity1"
  "field2": "some name",
  "details1": [{
    "field1": 11,
    "field2": "some value",
    "data": {
      "key1": "value1",
      "key2": "value2",
      "key3": "value3",
      // any other, unknown at compile time keys
    }
  }],
  "details2": {
    "field1": 13,
    "field2": "some value2"
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的尝试:

struct Entity1 {
  struct Details1 {
    let field1: UInt32
    let field2: String
    let data: [String: String]
  }

  struct Details2 {
    let field1: UInt32
    let field2: String
  }

  let field1: String
  static let entityName = "Entity1"
  let field2: String
  let details1: [Details1]
  let details2: Details2 
}
Run Code Online (Sandbox Code Playgroud)
  1. 为我们这样的目标使用结构而不是类是一个好主意吗?
  2. 我能否以任何方式定义嵌套结构或类,比如说Details1并同时创建它的变量?

像这样:

//doesn't compile 
struct Entity1 {
  let details1: [Details1 { 
  let field1: UInt32
  let field2: String
  let data: [String: String]
}]
Run Code Online (Sandbox Code Playgroud)

Vic*_*ler 18

你可以使用任何以下好的开源库来处理Swift中JSON到Object的映射,看一下:

每个人都有一个很好的初学者教程.

关于structor 的主题class,您可以考虑Swift编程语言文档中的以下文本:

结构实例始终按值传递,类实例始终通过引用传递.这意味着它们适用于不同类型的任务.在考虑项目所需的数据结构和功能时,请确定是将每个数据结构定义为类还是结构.

作为一般准则,考虑在满足以下一个或多个条件时创建结构:

  • 该结构的主要目的是封装一些相对简单的数据值.
  • 当您分配或传递该结构的实例时,期望复制封装的值而不是引用是合理的.
  • 结构存储的任何属性本身都是值类型,也可以复制而不是引用它们.
  • 该结构不需要从另一个现有类型继承属性或行为.

结构的良好候选者的例子包括:

  • 几何形状的大小,可能封装了width属性和height属性,两者都是Double类型.
  • 一种引用系列中的范围的方法,可能包含类型为Int的start属性和length属性.
  • 三维坐标系中的一个点,可能包含x,y和z属性,每个属性为Double.

在所有其他情况下,定义一个类,并创建要通过引用管理和传递的类的实例.实际上,这意味着大多数自定义数据结构应该是类,而不是结构.

我希望这对你有帮助.


hen*_*hao 5

HandyJSON正是你所需要的.参见代码示例:

struct Animal: HandyJSON {
    var name: String?
    var id: String?
    var num: Int?
}

let jsonString = "{\"name\":\"cat\",\"id\":\"12345\",\"num\":180}"

if let animal = JSONDeserializer.deserializeFrom(json: jsonString) {
    print(animal)
}

https://github.com/alibaba/handyjson


Vas*_*huk 5

细节

  • Xcode 10.2.1 (10E1001),Swift 5

链接

豆荚:

更多信息:

任务

使用iTunes Search API通过简单请求获取 iTunes 搜索结果https://itunes.apple.com/search?term=jack+johnson

完整样品

import UIKit
import Alamofire

// Itunce api doc: https://affiliate.itunes.apple.com/resources/documentation/itunes-store-web-service-search-api/#searching

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        loadData()
    }
    
    private func loadData() {
        let urlString = "https://itunes.apple.com/search?term=jack+johnson"
        Alamofire.request(urlString).response { response in
            guard let data = response.data else { return }
            do {
                let decoder = JSONDecoder()
                decoder.keyDecodingStrategy = .convertFromSnakeCase
                let result = try decoder.decode(ItunceItems.self, from: data)
                print(result)
            } catch let error {
                print("\(error.localizedDescription)")
            }
        }
    }
}

struct ItunceItems: Codable {
    let resultCount: Int
    let results: [ItunceItem]
}

struct ItunceItem: Codable {
    var wrapperType: String?
    var artistId: Int?
    var trackName: String?
    var trackPrice: Double?
    var currency: String?
}
Run Code Online (Sandbox Code Playgroud)


bLa*_*oLE 0

你可以使用 SwiftyJson 和let json = JSONValue(dataFromNetworking) if let userName = json[0]["user"]["name"].string{ //Now you got your value }