Создание данных JSON и разбор в swift - PullRequest
0 голосов
/ 04 июня 2018

У меня проблема с правильным анализом данных JSON с моего веб-сервера.Я попытался проанализировать данные JSON из файлов, которые я нашел в Интернете, и это работало нормально, но затем я попытался создать свои единственные данные JSON и попытался проанализировать их быстро.Проблема в том, что я могу видеть данные JSON при вызове адреса в моем браузере, но когда я пробую их в Swift, они не работают.Я также попытался отладить, чтобы увидеть, что я получаю в ответ, и массив курсов пуст.

Вот мой код Java:

@GET
@Path("/course")
@Produces(MediaType.APPLICATION_JSON)
public List getCourse(){
    List courseList = new ArrayList();
    Course pCourse = new Course(0, "name", "ll", null);
    courseList.add(pCourse);

    return courseList;
}

Данные "курса" из Java:

public int id;
public String name;
public String link;
public String imageUrl;

public Course() {
}

public Course(int id, String name, String link, String imageUrl) {
    this.id = id;
    this.name = name;
    this.link = link;
    this.imageUrl = imageUrl;
}

Вот мой код Swift:

URLSession.shared.dataTask(with: costumeUrl) { (data, response, err) in
    guard let data = data else{ return}
//            let dataString = String(data: data, encoding: .utf8)
//            print(dataString)
    do{
        let course = try JSONDecoder().decode([Course].self, from: data)
        print(course)
    }catch let jsonError{
        print(jsonError)
    }
    }.resume()

Данные "Курса" от Swift:

struct Course: Decodable {
    let id: Int
    let name: String
    let link: String
    let imageUrl: String

    init(json: [String: Any]){
        id = json["id"] as? Int ?? -1
        name = json["name"] as? String ?? ""
        link = json["link"] as? String ?? ""
        imageUrl = json["imageUrl"] as? String ?? ""

    }
}

А вот ответы в моем браузере:

[{"id":0,"imageUrl":null,"link":"ll","name":"name"}]

Если у вас есть какие-либо вопросы или вам нужна дополнительная информация, пожалуйста, задавайте.Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Можете ли вы изменить свою модель курса следующим образом:

struct Course: Decodable {

    let id: Int?
    let name: String?
    let link: String?
    let imageUrl: String?

    private enum CodingKeys: String, CodingKey {
        case id
        case name
        case link
        case imageUrl
    }
}
0 голосов
/ 04 июня 2018

Попробуйте эту модель курса:

Уход: используйте decodeIfPresent, если значение из вашего ответа JSON может быть нулевым.

class Course: Decodable {
    let id: Int
    let name: String
    let link: String
    let imageUrl: String?

    private enum CourseCodingKeys: String, CodingKey {
        case id = "id"
        case name = "name"
        case link = "link"
        case imageUrl = "imageUrl"
    }

    required init(from decoder: Decoder) throws {
        let courseContainer = try decoder.container(keyedBy: CourseCodingKeys.self)
        self.id = try courseContainer.decode(Int.self, forKey: .id)
        self.name = try courseContainer.decode(String.self, forKey: .name)
        self.link = try courseContainer.decode(String.self, forKey: .link)
        self.imageUrl = try courseContainer.decodeIfPresent(String.self, forKey: .imageUrl)
    }
}
...