Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Простой способ получить данные с сервера с помощью 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)
}
Вы можете попробовать приведенный выше код на игровой площадке.
Попробуйте разместить на игровой площадке следующее:
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)
}
}
Вот некоторые ресурсы для использования протокола кодирования: