Swifity JSON проблема с синтаксическим анализом JSON в ViewController из других библиотек / фреймворков - PullRequest
0 голосов
/ 05 августа 2020

У меня есть следующее json выглядит так:

"message": "Something message here"
"data": [ 
  { "_id": "671672167bhw2hw"
    "photo": "https://uploads.example.com/671672167bhw2hw.jpg"
    "description": "Something description here"
    "date": "2020-07-01T09:44:15.448Z"
     "user": "John Doe"
  }
 ]
}

Я использовал библиотеку Swiftify JSON для декодирования и анализа JSON. Мой код выглядит так:

class Post: NSObject {
 var message: String
 var text: String?
 var photoURL: URL?
 var date: Date?
}

init(json: JSON) {
  self.user = User(id: json["user_id"].stringValue,
                         name: json["user"].stringValue,
                         photoURL: URL(string: json["user_photo"].stringValue))
  self.message = json["message"].stringValue
  self.objectId = json["data"]["_id"].stringValue
  self.text = json["data"]["description"].string
  self.date = DateFormatter.iso8601.date(from: json["data"]["date"].stringValue)
}

и мои расширения ApiManager

 static func getPosts(before date: Date? = nil, withSuccess success: @escaping (Bool, [Post]) -> Void) {
        guard let url = URL(string: ApiEndpoint.Wall.getPosts) else {
            success(false, [Post]())
            return
        }
        
        var json = [String: String]()
        
        DispatchQueue.global(qos: .background).async {
            ApiManager.request(url: url, method: .post, parameters: json) { response, statusCode in
                switch statusCode {
                case 200:
                    success(true, ApiManager.getWallPostsFrom(response: response))
                    return
                    
                default: break
                }
                
                success(false, [Post]())
                return
            }
        }
    }
    
    private static func getPostsFrom(response: DataResponse<Any>) -> [Post] {
        var result = [Post]()
        
        guard let value = response.result.value,
            let jsonArray = JSON(value).array else { return result }
        
        for json in jsonArray {
            let object = Post(json: json)
            result.append(object)
        }
        
        return result
    }
    
}

Я получаю ответ с 200, все в порядке. Но все еще не работает для отображения данных в PostViewController. Что случилось? Кроме того, я использую свои собственные библиотеки для вкладок в приложении, таких как Контакты, Сообщения, Панель обсуждения и т. Д., Поэтому я использую свою собственную библиотеку с некоторыми файлами, моделями, представлениями, ресурсами для любой вкладки.

Ниже мой PostViewController для отображение данных из JSON.

private func tryGetPosts() {
        canLoadPosts = false

        tableView.dataState = .downloading
         ApiManager.getPosts(before: Posts.last?.date) { [weak self] (success, objects) in
            self?.tableView.dataState = .noData
            
            print("Objects count: ", objects)

            guard objects.count > 0 else { return }

            #warning("Insert animation")
            self?.tableView.beginUpdates()
            self?.Posts += objects
            let indexPaths = (self!.Posts.count - objects.count ..< self!.Posts.count)
                .map { IndexPath(row: $0, section: 0) }
            self?.tableView.insertRows(at: indexPaths, with: .top)
            self?.tableView.endUpdates()
            self?.Posts.insert(contentsOf: objects, at: self?.Posts.count ?? 0)
            self?.tableView.reloadData()
            self?.canLoadWallPosts = true
        }

Пожалуйста, за любой ответ и совет. С уважением.

1 Ответ

0 голосов
/ 10 августа 2020

Ответ на эту проблему был в JSON(value).array.

Если ваша структура JSON имеет подобный массив «данных», вы можете написать JSON(value)["data"].array. Swifty JSON - действительно удобная и простая библиотека.

...