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

回答編集履歴

1

追記

2018/07/03 02:49

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -9,4 +9,50 @@
9
9
 
10
10
  JSONの定義を決める際には一つのAPI機能に一意な構造を一般には規定します。
11
11
  条件別に構造を変化させるなんてことはわざわざ行いません。
12
- 存在しないように見えるフィールドは単に省略されているだけの場合が多いのです。
12
+ 存在しないように見えるフィールドは単に省略されているだけの場合が多いのです。
13
+
14
+ 追記:
15
+
16
+ サイズをReaderから取得したうえでデコーダーに渡したい場合の実装例です。
17
+ io.TeeReaderとio.Copyを組み合わせます。
18
+
19
+ https://play.golang.org/p/rHDT0SHUnwp
20
+ ```go
21
+ package main
22
+
23
+ import (
24
+ "bytes"
25
+ "encoding/json"
26
+ "fmt"
27
+ "io"
28
+ "io/ioutil"
29
+ "log"
30
+ )
31
+
32
+ var buff = bytes.NewBufferString(`{"messages":[],"body":[]}`)
33
+
34
+ func GetSizeFromReader(r io.Reader) (sz int64, reader io.Reader, err error) {
35
+ b := bytes.NewBuffer(nil)
36
+ n, err := io.Copy(ioutil.Discard, io.TeeReader(r, b))
37
+ if err != nil {
38
+ return 0, nil, err
39
+ }
40
+ return n, b, nil
41
+ }
42
+
43
+ func main() {
44
+ sz, r, err := GetSizeFromReader(buff)
45
+ if err != nil {
46
+ log.Fatalln(err)
47
+ }
48
+ if sz > 0 {
49
+ var v interface{}
50
+ if err := json.NewDecoder(r).Decode(&v); err != nil {
51
+ log.Fatalln(err)
52
+ }
53
+ fmt.Println(v)
54
+ }
55
+ }
56
+ ```
57
+
58
+ httpのハンドリングであればContent-Lengthヘッダーをパースするのも一つの手かと。