質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

493閲覧

【Swift】レンタルサーバー上のjsonファイルを読み込む(SwiftUIチュートリアル)

H_jyunn

総合スコア0

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2022/12/04 05:45

編集2022/12/04 09:39

前提

swiftの本を一冊読み本の通りにクイズアプリを作成し、次にswiftUIのチュートリアルを終えました。
今までローカル上で動作させていたため、サーバーと連携することに触れていませんでした。
この度、サーバー連携の第一歩として、まずはチュートリアルのソースコードを色々変更し、挙動を試していました。

大まかな質問

-下記のSwiftUIのチュートリアルでは、ローカル上にあるjsonファイルを読み込んでいます
https://developer.apple.com/tutorials/swiftui/working-with-ui-controls
-ここで、レンタルサーバーにアップロードしてあるjsonファイルを読み込むようにコードを変更したいです。
-内容が誤っていた際に、外部サーバーのjsonファイルを変更すれば手軽に内容を書き換えることができるために、そのように変更したいと考えております。

実現したいこと

  1. レンタルサーバーにアップロードしてある「landmarkData.json」ファイルを読み込む
  2. 読み取る際はHTTP(アップロード先:http://abc.com/landmarkData.jsonとします)

チュートリアルのソースコード

下記のソースコードでローカル上の「landmarkData.json」を読み込んでいます
該当のソースコード名は「ModelData.swift」です

ModelData.swift

1import Foundation 2import Combine 3 4final class ModelData: ObservableObject { 5 @Published var landmarks: [Landmark] = load("landmarkData.json") 6 var hikes: [Hike] = load("hikeData.json") 7 @Published var profile = Profile.default 8 9 var features: [Landmark] { 10 landmarks.filter { $0.isFeatured } 11 } 12 13 var categories: [String: [Landmark]] { 14 Dictionary( 15 grouping: landmarks, 16 by: { $0.category.rawValue } 17 ) 18 } 19} 20 21func load<T: Decodable>(_ filename: String) -> T { 22 let data: Data 23 24 guard let file = Bundle.main.url(forResource: filename, withExtension: nil) 25 else { 26 fatalError("Couldn't find \(filename) in main bundle.") 27 } 28 29 do { 30 data = try Data(contentsOf: file) 31 } catch { 32 fatalError("Couldn't load \(filename) from main bundle:\n\(error)") 33 } 34 35 do { 36 let decoder = JSONDecoder() 37 return try decoder.decode(T.self, from: data) 38 } catch { 39 fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)") 40 } 41}

試したこと

-ソースコードを変更

ModelData.swiftの5行目

1 @Published var landmarks: [Landmark] = load("http://abc.com/landmarkData.json")

-ATSを無効化
デフォルトでHTTP通信がブロックされているのでは?と考え、下記のサイトのように設定しました
https://ios-docs.dev/app-transport-security/)

-「json from url swift」と調べて出てきたやり方をやってみたが他のswiftファイルと整合性が合わずエラー多発...

ここまでご覧いただきありがとうございます。
是非とも回答いただけるととても嬉しいです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/12/04 08:28

外部サーバーへのアクセスは時間がかかるので非同期処理になります。また、失敗する可能性があるのでその対処も必要かと。
H_jyunn

2022/12/04 09:20

Hoshiさん コメントありがとうございます! 非同期処理と同期処理を混合していました... 非同期処理である、Swift Concurrency(async/await)かCombineを理解し、アクセスに失敗した場合も配慮し、書き直したいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問