代码之家  ›  专栏  ›  技术社区  ›  zardon

Swift-使用可解码来解码仅包含字符串的JSON数组

  •  -1
  • zardon  · 技术社区  · 7 年前

    我有一个示例JSON,其中它只是一个字符串数组,没有键,希望使用 Decodable 使用JSON并从中创建简单模型的协议。

    json如下所示:

    { "names": [ "Bob", "Alice", "Sarah"] }
    

    我不确定的是如何使用新的Swift 可解码 协议将其读入没有密钥的模型。

    我看到的大多数示例都假设JSON有一个键。

    即:

    // code from: Medium article: https://medium.com/@nimjea/json-parsing-in-swift-2498099b78f
    
    struct User: Codable{
           var userId: Int
           var id: Int
           var title: String
           var completed: Bool
    }
    
    do {
        //here dataResponse received from a network request
        let decoder = JSONDecoder()
        let model = try decoder.decode([User].self, from:
                     dataResponse) //Decode JSON Response Data 
        print(model)
    } catch let parsingError {
        print("Error", parsingError)
    }
    

    上述示例假设json是一个键值;如何使用可解码协议在没有密钥的情况下对JSON进行反编码?

    谢谢

    2 回复  |  直到 7 年前
        1
  •  3
  •   Shehata Gamal    7 年前

    对于这个简单的json结构,我想最好不要创建任何结构并使用

    let model = try decoder.decode([String:[String]].self, from: dataResponse)
    print(model["names"])
    

    适合您的模型的json是

    {
    
        "names": [{ 
              "userId": 2,
             "id": 23,
             "title": "gdgg",
             "completed": true
    
        }]
    }
    
    
    struct Root: Codable {
        let names: [User]
    }
    
    struct User: Codable {
        let userId, id: Int
        let title: String
        let completed: Bool
    
    }
    
        2
  •  3
  •   vadian    7 年前

    struct User: Decodable {
       let names: [String]
    }
    

    let model = try decoder.decode(User.self, from: dataResponse)
    

    let names = model.names
    

    或者传统上没有 JSONDecoder

    let model = try JSONSerialization.jsonObject(with: dataResponse) as? [String:[String]]