次の要点を考慮してください:https://gist.github.com/anonymous/0703a591f97fa9f6ad35b29234805fbd - ファイルの長さが長いため、すべての関連情報を効率的に表示する方法はありません。謝罪JSONオブジェクトのデコード(パラメータ付きGETリクエストの送信) - スウィフト4デコード可能
デコードしようとしているネストされたJSONオブジェクトがいくつかあります。
{
"establishments":[
{ ... }
],
"meta":{ ... },
"links":[
]
}
^establishments
配列は、私のコードは、私が実際にスウィフト4のJSONDecode()
機能を利用していますViewController.swift
の7行目まで正常に実行されEstablishment
オブジェクト
が含まれています。
ViewController.swift
let jsonURLString = "http://api.ratings.food.gov.uk/Establishments?address=\(self.getPostalCode(place: place))&latitude=\(place.coordinate.latitude.description)&longitude=\(place.coordinate.longitude.description)&maxDistanceLimit=0&name=\(truncatedEstablishmentName[0].replacingOccurrences(of: "'", with: ""))"
guard let url = URL(string: jsonURLString) else { print("URL is invalid"); return }
URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
guard let data = data, error == nil, response != nil else {
print("Something went wrong")
return
}
//print("test")
do {
let establishments = try JSONDecoder().decode(Establishments.self, from: data)
print(establishments)
} catch {
print("summots wrong")
}
}).resume()
IはEstablishment.swift
で見マッピングさJSONオブジェクトの取得が出力される:summots wrong
- ViewController.swift
のライン11上に。
{
"establishments":[ ... ],
"meta":{ ... },
"links":[ ]
}
が、私のクラス構造は、/私は私のビューコントローラで何をやっている場合、私は知らない。
私はJSON形式はとても似ているので、期待どおりに動作しない理由があると信じてこのレイアウト基準を満たす。
どこに間違っているのでしょうか?私はそれが非常に基本的なものだと思うが、私はそれのまわりで私の頭を取得するように見えることはできません
私も、私は名前の大文字とクラスの属性になっていないよということを理解 - 任意の規則
を破壊するための謝罪編集:私の代わりに自分の文のエラーを印刷し、それは次のとおりです。
の代わりに:print("summots wrong")
私が書いた:print(error)
dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.})))
Hamishが正しく指摘したように、私はGETリクエストから正しいJSONデータを受け取っていません。実際、私はJSONを全く受け取っていません。 x-api-version
が2
に設定されていない場合、私が使用しているAPIはXML形式にデフォルト設定されています。私のJSON出力を取り出すためにx-api-version: 2
、accept: application/json
とcontent-type: application/json
:私は次のヘッダーとポストマンを使用print(String(data: data, encoding: .utf8))
ライン
:私のViewController.swift
ファイルで
代わりの//print("test")
The API 'Establishments' doesn't exist
というエラーが表示されます。
私はこのURLでヘッダーを送信する方法はありますか?
編集2:URL
ではなく、URLRequest
の使用を変更しました。ここで
私の更新ViewController.swift
コードです:私はエラーを取得しています
let jsonURLString = "http://api.ratings.food.gov.uk/Establishments?address=\(self.getPostalCode(place: place))&latitude=\(place.coordinate.latitude.description)&longitude=\(place.coordinate.longitude.description)&maxDistanceLimit=0&name=\(truncatedEstablishmentName[0].replacingOccurrences(of: "'", with: ""))"
guard let url = URL(string: jsonURLString) else { print("URL is invalid"); return }
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.addValue("x-api-version", forHTTPHeaderField: "2")
request.addValue("accept", forHTTPHeaderField: "application/json")
request.addValue("content-type", forHTTPHeaderField: "application/json")
URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
guard let data = data, error == nil, response != nil else {
print("Something went wrong")
return
}
print(String(data: data, encoding: .utf8))
// do {
// let establishments = try JSONDecoder().decode(Establishments.self, from: data)
// print(establishments)
// } catch {
// print(error)
// }
}).resume()
: HTTP Error 400. The request has an invalid header name
私はいくつかのチェックをした、それは要求がちょうど2
のx-api-version
ヘッダー値を無視します
アイデア
EDIT 3:addValue
の正しい形式がされている必要があります : request.addValue("2", forHTTPHeaderField: 'x-api-version
のように。
私は今、私のクラス宣言、特に私の 'メタ'クラスの問題に直面しています。
Meta.(CodingKeys in _DF4B170746CD5543281B14E0B0E7F6FB).dataSource], debugDescription: "Expected String value but found null instead.", underlyingError: nil
私のクラスの宣言は、それがJSONオブジェクトから期待のデータをマッチングされていないので、それは文句を言っています。
私のJSON応答(要旨を参照)において、2つのmeta
オブジェクトがあり、一つはdataSource
ためnull
の値を含み、他方はLucene
あります。
デコード可能なプロトコルに準拠して、私のクラス初期化子の文字列と同様に 'null'値を受け入れる方法はありますか?
JSONレスポンスのその部分は私には死んでいますが、それでもオブジェクトを作成する必要はありますか、それとも無視するだけでいいですか? - 何も宣言することなく。または、データを使用できるようにするためにJSONレスポンスのすべてをメモする必要がありますか?
また、要点にリンクするのではなく、コードの関連部分(好ましくは[mcve])を質問本体にコピーして貼り付けてください。私たちはあなたの質問を理解するためにこのページを離れることを期待されるべきではありません。 – Hamish
建設的な批評家のおかげで、私は質問にいくつかの編集を加えました –
私はJSONバリデーターを通してJSON出力を実行しましたが、すべてが有効であるようです。何か案は? :\ –