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

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

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

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

JSON

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

Q&A

解決済

1回答

723閲覧

【Go】JSONをファイル保存するとEnd of file expectedエラーが出る

defire

総合スコア15

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

JSON

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

0グッド

0クリップ

投稿2022/06/18 11:57

編集2022/06/18 12:43

前提・実現したいこと

APIへリクエストして返ってきたJSONデータから1000件ほどを取得し、
必要な値のみJSONファイルとして保存したい。

発生している問題・エラーメッセージ

データの書き込みはできるが、VS CodeでEnd of file expectedとエラーがでる

イメージ説明

該当のソースコード

Go

1package main 2 3import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "log" 8 "net/http" 9 "os" 10 "strconv" 11 "time" 12) 13 14type Api_info struct { 15 api_ip string 16 a_id string 17 hits string 18 output string 19 20} 21 22type Save_info struct { 23 Title string `json:"title"` 24 Aurl string `json:"a_url"` 25} 26 27func main() { 28 29 api := Api_info{ 30 api_ip: "exapmleexapmleexapmle", 31 a_id: "exapmleexapmleexapmle", 32 hits: "30", 33 output: "json", 34 } 35 36 offset_count := 1 37 save_max_count := 1 38 39 num, _ := strconv.Atoi(api.hits) 40 41 os.Create("test_4.json") 42 43 for { 44 url := "https://api.exapmleexapmleexapmle.com" 45 46 request, err := http.NewRequest("GET", url, nil) 47 if err != nil { 48 log.Fatal(err) 49 } 50 51 params := request.URL.Query() 52 params.Add("api_id", api.api_ip) 53 params.Add("a_id", api.a_id) 54 params.Add("hits", api.hits) 55 params.Add("output", api.output) 56 57 58 request.URL.RawQuery = params.Encode() 59 fmt.Println(request.URL.String()) 60 61 62 timeout := time.Duration(5 * time.Second) 63 client := &http.Client{ 64 Timeout: timeout, 65 } 66 67 response, err := client.Do(request) 68 if err != nil { 69 log.Fatal(err) 70 break 71 } 72 defer response.Body.Close() 73 74 body, err := io.ReadAll(response.Body) 75 if err != nil { 76 log.Fatal(err) 77 } 78 79 var jsonOBJ interface{} 80 81 errr := json.Unmarshal(body, &jsonOBJ) 82 if errr != nil { 83 break 84 } 85 86 bb := jsonOBJ.(map[string]interface{})["result"] 87 cc := bb.(map[string]interface{})["items"] 88 c := cc.([]interface{}) 89 90 for _, ii := range c { 91 m := ii.(map[string]interface{}) 92 93 Title := m["title"].(string) 94 a_url := m["a_URL"].(string) 95 96 file_json := Save_info{ 97 Title, a_url, 98 } 99 100 jj, _ := json.MarshalIndent(file_json, "", " ") 101 f, _ := os.OpenFile("test_4.json", os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.ModePerm) 102 f.Write(jj) 103 defer f.Close() 104 105 } 106 107 offset_count = num + offset_count 108 109 } 110 111}

自分で調べたことや試したこと

osパッケージを利用したファイルへの追記方法や
json.Marshal , json.MarshalIndentなどの使い方を調べて書きました。

JSON単一情報を書き込む情報はあったので、
それを元にループ処理させるようにしましたが、
エラーが解消しません。

使っているツールのバージョンなど補足情報

go1.18.3 linux/amd64
VS Code 1.68.1
Ubuntu 22.04

お知恵を拝借できれば幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

解決しました。for文の外に書き込みを指定したら動きました。

投稿2022/06/18 16:27

defire

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問