12274


Goで下のような構造体をbase64を使ってjsonにしたいと考えています。  
一つ考えられるのはencoding/base64の`EncodeToString()`を使って一旦`[]byte`を文字列に直すという方法ですが、どのように`MarshalJSON`,
`UnMarshalJSON()`を実装すればいいのでしょうか?

[code]

    
    type Picture struct {
        Id int64
        Data []byte
        Name string
    }
    
    
[/code]


CC BY-SA 3.0
2015-07-11T02:05:12.610
12269
2015-07-11T06:21:31.570
5246
question
json go
Goで[]bytesを含む構造体をbase64を使ってjson化する


Encodeは、一旦`map[string]interface{}`にしてから`json.Marshal()`するのはどうでしょうか？

[code]

    func MarshalJSON(p *Picture) (string, error) {
        o := map[string]interface{} {
            "id" : p.Id,
            "data" : EncodeToString(p.Data),
            "name" : p.Name,
        }        
        if b, err := json.Marchal(o) ; err == nil {
            return string(b), nil
        } else {
            return "", err
        }
    }
    
[/code]

Decodeはこの逆で、一旦`map[string]interface{}`として取り出してから、`Data`部分のBASE64文字列を[]byteに展開する
というのはどうでしょうか？


CC BY-SA 3.0
2015-07-11T04:19:20.793
12271
2015-07-11T04:19:20.793
845
12269
answer


Goの`json.Marshal`は自動的に`[]byte`をBase64に変換します。

<http://play.golang.org/p/9jWlQY_wo9>

`json.Unmarshal`も同様にデコード先の型が`[]byte`だった場合、JSONの文字列をBase64エンコーディングとみなして自動的にデコードします。(文字列が`==`で終わっている必要あり)

<http://play.golang.org/p/Auhup66_4Y>

> Array and slice values encode as JSON arrays, except that []byte  
>  encodes as a base64-encoded string, and a nil slice encodes as the  
>  null JSON object.

<http://golang.org/pkg/encoding/json/#Marshal>


CC BY-SA 3.0
2015-07-11T05:59:41.953
12274
2015-07-11T06:21:31.570
2015-07-11T06:21:31.570
3639
3639
12269
answer