teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コード例追加

2018/01/17 04:39

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -12,4 +12,34 @@
12
12
  jsonのerrosは`"errors":[...]` こう書かれていますのでこれはjsonの配列です。
13
13
  goの該当する型はスライスなのでスライス型を書く必要があります。
14
14
 
15
- つまり `errors struct{` と書いてるところは `Errors []struct{` になります。
15
+ つまり `errors struct{` と書いてるところは `Errors []struct{` になります。
16
+
17
+ 追記2:
18
+
19
+ [https://play.golang.org/p/RKwUmzQatl3](https://play.golang.org/p/RKwUmzQatl3)
20
+ ```go
21
+ package main
22
+
23
+ import (
24
+ "encoding/json"
25
+ "fmt"
26
+ "log"
27
+ )
28
+
29
+ const resp = `{"errors":[{"code":89,"message":"Invalid or expired token."}]}`
30
+
31
+ type Error struct {
32
+ Errors []struct {
33
+ Code int `json:"code"`
34
+ Message string `json:"message"`
35
+ } `json:"errors"`
36
+ }
37
+
38
+ func main() {
39
+ var v Error
40
+ if err := json.Unmarshal([]byte(resp), &v); err != nil {
41
+ log.Fatalln(err)
42
+ }
43
+ fmt.Println(v)
44
+ }
45
+ ```

1

コメントをうけて追記

2018/01/17 04:39

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -2,4 +2,14 @@
2
2
 
3
3
  後半に書かれた定義は二点おかしいところがあります。
4
4
  ひとつは構造体のフィールド名は大文字で始まっていないとjsonのデコード、エンコード対象になりません。
5
- もう一つはerrorsはアレイ型なのでGo側の定義はスライスでなくてはなりません。
5
+ もう一つはerrorsはアレイ型なのでGo側の定義はスライスでなくてはなりません。
6
+
7
+ 追記:
8
+
9
+ - Go側のerrorsの頭文字が小文字なのでNGです。
10
+ - Go側のCodeの型がstringだと数値を受け取れません。
11
+
12
+ jsonのerrosは`"errors":[...]` こう書かれていますのでこれはjsonの配列です。
13
+ goの該当する型はスライスなのでスライス型を書く必要があります。
14
+
15
+ つまり `errors struct{` と書いてるところは `Errors []struct{` になります。