如何在 Swift 4 ios 中编码 json 数组

Posted

技术标签:

【中文标题】如何在 Swift 4 ios 中编码 json 数组【英文标题】:How to encode jsonarray on Swift 4 ios 【发布时间】:2017-10-20 15:30:18 【问题描述】:

我有一个这样的 JSON 数组

[
    
        "value" : "temp",
        "value2" : "temp2",
        "value3" : "temp3",
    ,
    
       "value" : "temp";
       "value2" : "temp2",
       "value3" : "temp3",
    ,  
       "value" : "temp",
       "value2" : "temp2",
       "value3" : "temp3",
    
]

我尝试在 swift 4 for ios app 上解析它。 我没有找到关于这个主题的任何解决方案。 我已经尝试了很多这样的代码

let jsonpars = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as! [AnyObject]

【问题讨论】:

字符串不是有效的 JSON。 请搜索:There are more than 2700 related questions。在 Swift 4 中,您可以使用 JSONDecoder 就像 Aris 说的 JSON 格式是错误的,所以先解决这个问题,然后再讨论 【参考方案1】:

您提供的 JSON 无效。正确的 JSON 格式应如下所示:

    将每次出现的= 替换为: 用逗号替换每个;

结果应该是这样的:

[
    
        "value":"temp",
        "value2":"temp2",
        "value3":"temp3",
    ,
    ...
]

那么,您提供的解析代码示例应该可以正常工作了。

您的示例 JSON 看起来像解析后打印出来的内容。例如:

let jsonpars = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as! [AnyObject]

print(jsonpars)

产生一个 debug 版本的 JSON 输出:

[
    value = temp;
    value2 = temp2;
    value3 = temp3;
 , 
 ...
]

真正的 JSON,你要解析的数据,必须有冒号和逗号。

【讨论】:

【参考方案2】:

使用quicktype,我为您的示例生成了这个模型和转换代码(在更正了语法问题之后):

import Foundation

struct Value: Codable 
    let value, value2, value3: String


extension Array where Element == Value 
    static func from(json: String, using encoding: String.Encoding = .utf8) -> [Value]? 
        guard let data = json.data(using: encoding) else  return nil 
        return [Value].from(data: data)
    

    static func from(data: Data) -> [Value]? 
        let decoder = JSONDecoder()
        return try? decoder.decode([Value].self, from: data)
    

    var jsonData: Data? 
        let encoder = JSONEncoder()
        return try? encoder.encode(self)
    

    var jsonString: String? 
        guard let data = self.jsonData else  return nil 
        return String(data: data, encoding: .utf8)
    

然后你可以像这样反序列化:

let values = [Value].from(json: """
    [
        
            "value": "temp",
            "value2": "temp2",
            "value3": "temp3"
        ,
        
           "value": "temp",
           "value2": "temp2",
           "value3": "temp3"
        ,
        
           "value": "temp",
           "value2": "temp2",
           "value3": "temp3"
        
    ]
""")!

【讨论】:

以上是关于如何在 Swift 4 ios 中编码 json 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 4 中使用 JSONDecoder 从嵌套 JSON 中获取数据?

在 Swift iOS 中解码的 PHP JSON 返回空值

IOS - 如何在 Swift 3 中从 JSON 中捕获动态数组维度

如何使用 Swift 创建 JSON Codable [关闭]

swift Swift 4中的自定义JSON编码/解码

JSON请求后的IOS/Swift渲染表