如何使用 SwiftyJSON 解析特定格式的 json?

Posted

技术标签:

【中文标题】如何使用 SwiftyJSON 解析特定格式的 json?【英文标题】:how can I parse a specific format of json with SwiftyJSON? 【发布时间】:2016-09-22 23:14:36 【问题描述】:

在我的swift 应用程序中,我正在从网络服务获取 cmets。传入json的一般格式为:

comments =     (
            
        "_id" = 57e460a4d9f58eb150470a0a;
        content = "fsagsd";
        "sent_at" = "2016-09-22T22:52:20.061Z";
        "username" = kamil;
    ,
            
        "_id" = 57e460c0d9f58eb150470a0b;
        content = "hfdhfd";
        "sent_at" = "2016-09-22T22:52:48.682Z";
        "username" = kamil;
    
);

这是print(response.result.value)的实际结果

整个查询(alamofire)如下所示:

Alamofire.request(.GET, "\(serverURL)/get/\(case_id)/comments/"/*, headers: headers*/)
        .validate()
        .responseJSON  response in

switch response.result 
            case .Success:
                print("success")
                if let jsonData = response.result.value as? [[String: AnyObject]] 
                    for myJSON in jsonData 
                        if let myTest = SingleComment.fromJSON(JSON(myJSON))
                            self.items.addObject(myJSON)
                            self.myTable.reloadData()
                        
                    
                

但是因为 cmets 嵌入在我的 json 中的 comments 中 - 我永远无法到达 self.items.addObject(myJSON)。如果传入的 json 看起来像这样,我认为它会起作用:

    
        "_id" = 57e460a4d9f58eb150470a0a;
        content = "fsagsd";
        "sent_at" = "2016-09-22T22:52:20.061Z";
        "username" = kamil;
    ,
            
        "_id" = 57e460c0d9f58eb150470a0b;
        content = "hfdhfd";
        "sent_at" = "2016-09-22T22:52:48.682Z";
        "username" = kamil;
    

因为我无法更改传入的 json - 你能帮我调整我的 swift 代码吗?

一个附加信息 - fromJSON 函数如下:

class func fromJSON(json: JSON) -> SingleComment? 
    print("single comment from json")
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    let username = json["username"].string
    let content = json["content"].string
    let sent_at = json["sent_at"].string
    let id = json["_id"].string
    let upd = dateFormatter.dateFromString(sent_at!)

    return SingleComment(username: username!, content: content!, sent_at: upd!, id: id!)

【问题讨论】:

【参考方案1】:

在 .Success 块中尝试此代码。希望对你有帮助。

    if let value = response.result.value 
                                    let data = JSON(value)
                                    if let responseDictionary = data.dictionary 
                                        if let commentsArray = responseDictionary["comments"]?.array 
                                            for commentObject in commentsArray 
                                                if let myTest = SingleComment.fromJSON(commentObject)
                                                    self.items.addObject(myJSON)

                                                
                                            
self.myTable.reloadData()
                                        
                                    
    

【讨论】:

【参考方案2】:

您的回复似乎不是正确的 json 数据。

首先,json 属性应该用: 分隔,而不是=。在您的示例中,"_id" = 57e460c0d9f58eb150470a0b; 应该是 "_id" : 57e460c0d9f58eb150470a0b;

其次,响应数据似乎是 jsonp 格式,因为它包含变量和分号。但是json格式还是不正确。所以我认为你的解决方案不是调整你的算法来适应这种奇怪的"json"数据,你必须问你的服务器,为什么它提供了这样一个奇怪的数据。

【讨论】:

以上是关于如何使用 SwiftyJSON 解析特定格式的 json?的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 swiftyJSON 快速解析 JSON

swift、Alamofire、SwiftyJSON:如何解析 arrayObject

如何使用 SwiftyJson 解析 JSON

我将如何使用 SwiftyJSON 解析这种类型的 JSON?

如何使用 Alamofire 和 SwiftyJSON 正确解析 JSON

SwiftyJSON - 解析时如何遍历子节点