Какой самый простой способ импортировать эти данные JSON в массив в Swift?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

-3
задан Nikolai Nyegaard 14 April 2019 в 11:13
поделиться

2 ответа

Простой способ получить данные с сервера с помощью URLSession и рассмотреть следующий код:

var request = URLRequest(url: URL(string: "https://www.norsk-tipping.no/api-keno/getResultInfo.json?drawID=4178")!)
    request.httpMethod = "GET"
    let session = URLSession.shared

    session.dataTask(with: request) {data, response, err in
        print("Entered the completionHandler")

        if let data = data {
            do {
                let gameData = try JSONDecoder().decode(GameData.self, from: data)
                print(gameData)
            } catch {
                print(error)
            }
        }
}.resume()

И Codable struct будет выглядеть так:

import Foundation

struct GameData: Codable {
    let gameID, drawID: Int
    let drawDate: String
    let levels, wagers, correct, odds: [Int]
    let winners, drawNumbers, unsortedDrawNumbers: [Int]
    let turnover: Int
}

Выше struct вы можете анализировать данные.

Или вы можете просто использовать стороннюю библиотеку, такую ​​как Alamofire , для обработки запроса к серверу.

Но здесь важно то, что вы не получаете правильный JSON с сервера, где

while(true);/* 0;

и

/* */

не должно быть там.

Если вы попытаетесь вручную попытаться, удалив его, вы можете получить drawNumbers из этого, как показано ниже:

let data = """

{
"gameID": 13,
"drawID": 4178,
"drawDate": "2019,04,13,20,00,00",
"levels": [
10,
0,
0,
0,
0,
0,
0,
9,
0,
0,
0,
0,
0,
8,
0,
0,
0,
0,
7,
0,
0,
0,
6,
0,
0,
0,
5,
0,
0,
4,
0,
0,
3,
0,
2
],
"wagers": [
5,
10,
20,
30,
50,
100
],
"correct": [
10,
9,
8,
7,
6,
5,
0,
9,
8,
7,
6,
5,
0,
8,
7,
6,
5,
4,
7,
6,
5,
4,
6,
5,
4,
3,
5,
4,
3,
4,
3,
2,
3,
2,
2
],
"odds": [
200000,
5000,
200,
20,
4,
1,
1,
50000,
1100,
50,
8,
2,
1,
10000,
240,
20,
3,
1,
2400,
100,
10,
1,
420,
20,
3,
1,
200,
9,
1,
35,
2,
1,
18,
1,
7
],
"winners": [
0,
5,
27,
196,
959,
3308,
1556,
1,
0,
8,
56,
219,
294,
1,
3,
59,
305,
1043,
5,
10,
77,
386,
2,
58,
393,
1340,
16,
108,
548,
44,
433,
1682,
126,
971,
259
],
"drawNumbers": [
1,
13,
23,
30,
40,
42,
43,
48,
49,
50,
51,
52,
53,
54,
55,
56,
60,
61,
63,
65
],
"unsortedDrawNumbers": [
63,
52,
13,
56,
53,
30,
54,
23,
65,
55,
61,
1,
51,
42,
60,
43,
48,
49,
50,
40
],
"turnover": 795865
}

""".data(using: .utf8)!

    do {
        let gameData = try JSONDecoder().decode(GameData.self, from: data)
        print(gameData.drawNumbers) //[1, 13, 23, 30, 40, 42, 43, 48, 49, 50, 51, 52, 53, 54, 55, 56, 60, 61, 63, 65]
    } catch {
        print(error)
    }

Вы можете попробовать приведенный выше код на игровой площадке.

0
ответ дан Dharmesh 14 April 2019 в 11:13
поделиться

Попробуйте разместить на игровой площадке следующее:

let sampleResponse = """
{"gameID":13,"drawID":4178,"drawDate":"2019,04,13,20,00,00","levels":[10,0,0,0,0,0,0,9,0,0,0,0,0,8,0,0,0,0,7,0,0,0,6,0,0,0,5,0,0,4,0,0,3,0,2],"wagers":[5,10,20,30,50,100],"correct":[10,9,8,7,6,5,0,9,8,7,6,5,0,8,7,6,5,4,7,6,5,4,6,5,4,3,5,4,3,4,3,2,3,2,2],"odds":[200000,5000,200,20,4,1,1,50000,1100,50,8,2,1,10000,240,20,3,1,2400,100,10,1,420,20,3,1,200,9,1,35,2,1,18,1,7],"winners":[0,5,27,196,959,3308,1556,1,0,8,56,219,294,1,3,59,305,1043,5,10,77,386,2,58,393,1340,16,108,548,44,433,1682,126,971,259],"drawNumbers":[1,13,23,30,40,42,43,48,49,50,51,52,53,54,55,56,60,61,63,65],"unsortedDrawNumbers":[63,52,13,56,53,30,54,23,65,55,61,1,51,42,60,43,48,49,50,40],"turnover":795865}
"""

У вас странный формат даты, поэтому вам нужно придумать средство форматирования даты, чтобы справиться с этим, который я написал ниже ...

extension DateFormatter {
    static let weirdDateFormat: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy,MM,dd,HH,mm,ss"
        formatter.calendar = Calendar(identifier: .gregorian)
        // add time zone, etc. here
        return formatter
    }()
}

Далее, мы используем Codable структуру для декодирования данных. Вот то, что я придумал, основываясь на предоставленной вами выборке.

struct ResponseObject: Codable {
    let gameID: Int
    let drawID: Int
    let drawDate: Date // Correct this to date
    let levels: [Int]
    let wagers: [Int]
    let correct: [Int]
    let odds: [Int]
    let winners: [Int]
    let drawNumbers: [Int]
    let unsortedDrawNumbers: [Int]
    let turnover: Int
}

Теперь мы декодируем JSON. Вы заметите, что я использовал расширение weirdDateFormat выше для отформатированного dateDecodingStrategy.

let jsonDecoder = JSONDecoder()
jsonDecoder.dateDecodingStrategy = .formatted(.weirdDateFormat)
if let data = sampleResponse.data(using: .utf8) {
    do {
        let response = try jsonDecoder.decode(ResponseObject.self, from: data)
        print(response)
    } catch {
        print(error)
    }
}

Вот некоторые ресурсы для использования протокола кодирования:

Форматы декодирования даты

Примеры кодирования

0
ответ дан Adrian 14 April 2019 в 11:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: