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

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

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

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

Q&A

1回答

4481閲覧

go言語 ginでjsonを返す時の可変長の時の対処方法について、

ShouYama

総合スコア36

Go

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

0グッド

0クリップ

投稿2016/08/24 18:34

#知りたいこと
jsonの値が変わる時にどうやってgin.H{}の中身を決めさせればいいかわからないので知りたい。
#やりたいこと
指定した楽天のレシピからレシピのデータをもってきてjsonにしたい
#コード

go

1package main 2 3import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "strings" 8 9 "github.com/PuerkitoBio/goquery" 10 "github.com/gin-gonic/gin" 11) 12 13type process struct { 14 Image string `json:"image"` 15 Operation string `json:"operation"` 16} 17 18type material struct { 19 Name []string `json:"name"` 20 Quantity []string `json:"quantity"` 21} 22 23//メインのjson 24type mesi struct { 25 Name string `json:"name"` 26 Image string `json:"image"` 27 MemberNum string `json:"membernum"` 28 Time string `json:"time"` 29 Fee string `json:"fee"` 30 Explanation string `json:"explanation"` 31 Material material `json:"material"` 32 Process []process `json:"process"` 33} 34 35//料理名(タイトル)を返す。 36func title(url string) string { 37 var i string 38 doc, _ := goquery.NewDocument(url) 39 doc.Find("h1").Each(func(_ int, s *goquery.Selection) { 40 i = s.Text() 41 }) 42 return i 43} 44 45//何人前かを返す関数 46func people(url string) string { 47 var i string 48 doc, _ := goquery.NewDocument(url) 49 doc.Find("div > div > div > div > div > h3 > span > span").Each(func(_ int, s *goquery.Selection) { 50 i = s.Text() 51 }) 52 return i 53} 54 55//時間のをstringで返す 56func time(url string) string { 57 var i string 58 doc, _ := goquery.NewDocument(url) 59 doc.Find("time#indication_time_itemprop").Each(func(_ int, s *goquery.Selection) { 60 i = s.Text() 61 }) 62 return i 63} 64func fee(url string) string { 65 var i string 66 doc, _ := goquery.NewDocument(url) 67 doc.Find("li.icnMoney").Each(func(_ int, s *goquery.Selection) { 68 i = s.Text() 69 }) 70 return i 71} 72 73//材料の量をstringの配列で返す 74func materialQuantity(url string) []string { 75 var quantity []string 76 doc, _ := goquery.NewDocument(url) 77 doc.Find("div > div > div > div > ul > li > p.amount").Each(func(_ int, s *goquery.Selection) { 78 quantity = append(quantity, s.Text()) 79 }) 80 return quantity 81} 82 83//手順をstringの配列で返す 84func procedure(url string) []string { 85 var procedure []string 86 doc, _ := goquery.NewDocument(url) 87 doc.Find("li#step_box_li.stepBox > p.stepMemo").Each(func(_ int, s *goquery.Selection) { 88 procedure = append(procedure, s.Text()) 89 }) 90 return procedure 91} 92 93//完成時の写真のurlをstringで返す。 94func image(url string) string { 95 var imgURL string 96 doc, _ := goquery.NewDocument(url) 97 doc.Find("div > div > span > img").Each(func(_ int, s *goquery.Selection) { 98 url, _ := s.Attr("src") 99 // fmt.Println(url) 100 imgURL = url 101 }) 102 return imgURL 103} 104 105//調理時のコツについてをstringで返す。 106func kotu(url string) string { 107 var kotu string 108 doc, _ := goquery.NewDocument(url) 109 doc.Find("div.howtoPointBox.last > p").Each(func(_ int, s *goquery.Selection) { 110 kotu = s.Text() 111 }) 112 return kotu 113} 114 115//材料の名前をstringの配列で返す 116func mat(url string) []string { 117 var materials []string 118 doc, _ := goquery.NewDocument(url) 119 doc.Find("div > div > div > div > ul > li > a#material_link.name").Each(func(_ int, s *goquery.Selection) { 120 materials = append(materials, s.Text()) 121 }) 122 return materials 123} 124 125//説明文を返す。 126func exp(url string) string { 127 var i string 128 doc, _ := goquery.NewDocument(url) 129 doc.Find(" div >div > div > div > p.summary").Each(func(_ int, s *goquery.Selection) { 130 i = s.Text() 131 }) 132 return i 133} 134 135//どの工程が写真を持つかを返す 136func haveImages(url string) []bool { 137 var test []bool 138 doc, _ := goquery.NewDocument(url) 139 140 f := doc.Find("li#step_box_li.stepBox") 141 f.Each(func(_ int, s *goquery.Selection) { 142 t, _ := s.Html() 143 if strings.Index(t, "img") != -1 { 144 test = append(test, true) 145 } else { 146 test = append(test, false) 147 } 148 }) 149 return test 150} 151 152//作り方内の写真を得る 153func getImages(url string) []string { 154 var quantity []string 155 doc, _ := goquery.NewDocument(url) 156 doc.Find("img#step_image.processImage").Each(func(_ int, s *goquery.Selection) { 157 t, _ := s.Attr("src") 158 // fmt.Println(t) 159 quantity = append(quantity, t) 160 }) 161 return quantity 162} 163 164func makejson(num string) mesi { 165 var recipe mesi 166 var mats material 167 var proc []process 168 url := "http://recipe.rakuten.co.jp/recipe/" 169 // sura := "/" 170 url = url + num 171 recipe.Name = title(url) 172 recipe.Image = image(url) 173 recipe.MemberNum = people(url) 174 recipe.Explanation = exp(url) 175 recipe.Time = time(url) 176 recipe.Fee = fee(url) 177 mats.Quantity = materialQuantity(url) 178 mats.Name = mat(url) 179 recipe.Material.Name = mats.Name 180 recipe.Material.Quantity = mats.Quantity 181 haveImage := haveImages(url) 182 prImages := getImages(url) 183 a := 0 184 for i, operation := range procedure(url) { 185 if haveImage[i] == true { 186 proc = append(proc, process{ 187 Image: prImages[a], 188 Operation: operation, 189 }) 190 a++ 191 } else { 192 proc = append(proc, process{ 193 Image: "", 194 Operation: operation, 195 }) 196 } 197 } 198 recipe.Process = make([]process, len(proc)) 199 copy(recipe.Process, proc) 200 fmt.Println(recipe) 201 return recipe 202} 203 204func main() { 205 router := gin.Default() 206 207 router.GET("/:num", func(c *gin.Context) { 208 num := c.Param("num") 209 t := makejson(num) 210 bytes, _ := json.Marshal(t.Process) 211 c.JSON(http.StatusOK, gin.H{"name": t.Name, 212 "image": t.Image, 213 "membernum": t.MemberNum, 214 "time": t.Time, 215 "fee": t.Fee, 216 "explanation": t.Explanation, 217 "material": gin.H{"name": t.Material.Name, 218 "quantity": t.Material.Quantity}, 219 "prosess": ここ}) 220 }) 221 router.Run(":8080") 222}

#場所
上のコードの一番下にあるprosessってところをどうすればいいのか全く分からない

どうやって、配列のjsonをこういう宣言方法なのにどうやればいいのかわからないので、
わかる人是非教えてください、また、この書き方よりいいのがあるってのも知りたいです。
ginを初めて使ったので詳しくなくてだめなのでよろしくおねがいします。

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

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

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

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

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

guest

回答1

0

gin.Hmap[string]interface{}型なので、そのままt.Processesを渡せば動作するはずです。しかし、そもそもc.JSONinterface{}型を受け取るので、そのままtを渡せば上手く動きませんか?

go

1c.JSON(http.StatusOK, t)

interface{}型についてはこちらの空インターフェースの辺りからを参考にしてください。

投稿2016/08/25 00:01

MakeNowJust

総合スコア545

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問