2016-08-26 22 views
2

Encodingのデフォルト値を "base64"に設定するにはどうすればよいですか?`encoding/json`を使ったデフォルトのgolang構造体ですか?

type FileData struct { 
    UID string `json:"uid"`     
    Size int `json:"size"` 
    Content string `json:content` 
    Encoding string `json:encoding` 
    User string `json:"user"` 
} 

私はあなたが行くタイプでコンストラクタを持っていないことができないので、

Encoding string `json:encoding`= "base64" // Not working 
+0

アレイとスライスの値は、[ことを除いて、JSON配列としてエンコードしています]バイトはbase64でエンコードされた文字列としてエンコードされ、nilスライスはnullのJSON値としてエンコードされます。 https://golang.org/pkg/encoding/json/ – foecum

+0

[GoでJSONを解析する際にデフォルト値を指定する方法](https://stackoverflow.com/questions/30445479/how-指定時のデフォルト値 - 解析時 - json-in-go) – vergenzt

答えて

3

を試してみました。

代わりに明示的なイニシャライザ関数(またはポインタ受信側のメソッド)またはコンストラクタ/ファクトリ関数(これは通常はNew<TypeName>と呼ばれますので、あなたのタイプはNewFileDataとなります)があり、型の初期値が返されます。

オールインワンで、これはXY問題のように感じます。あなたの質問から、あなたのフィールドの1つにマーシャリングされていないものがなければ、デフォルト値を持っているようです。 もしそうなら、JSONからアンマーシャルされたこの型の値を後処理し、Encodningにアンマーシャリングされていないものがあればそれを任意のデフォルト値に設定します。

別の方法としては、この方法を検討するかもしれない:

  1. あなたのフィールド用のカスタムタイプを持っています。

    type EncodingMethod stringのようなものです。

  2. このタイプのカスタムJSON非整列化メソッドがあります。この整列化メソッドは、必要な処理を行います。

3

あなたFileDataがあまりにも複雑ではありませんので、あなたは簡単にjson.Unmarshalerインターフェースを利用することができます。セパレートタイプとしてEncodingを宣言し、アンマーシャリング方法でデフォルト値を設定する:あなたは空のEncoding値とJSONをエンコードするとき

type FileData struct { 
    UID string `json:"uid"`     
    Size int `json:"size"` 
    Content string `json:content` 
    Encoding Encoding `json:encoding` // declared as a custom type 
    User string `json:"user"` 
} 

type Encoding string 

// implement the Unmarshaler interface on Encoding 
func (e *Encoding) UnmarshalJSON(b []byte) error { 
    var s string 
    if err := json.Unmarshal(b, &s); err != nil { 
     return err 
    } 
    if s == "" { 
     *e = Encoding("base64") 
    } else { 
     *e = Encoding(s) 
    } 
    return nil 
} 

は今、それがbase64に設定されます:

var data1 = []byte(`{"uid": "UID", "size": 10, "content": "CONTENT", "encoding": "ASCII", "user": "qwe"}`) 
var data2 = []byte(`{"uid": "UID", "size": 10, "content": "CONTENT", "encoding": "", "user": "qwe"}`) 

func main() { 
    fmt.Println("Hello, playground") 
    f := FileData{} 
    if e := json.Unmarshal(data1, &f); e != nil { 
     fmt.Println("Error:", e) 
    } 
    fmt.Println(f, f.Encoding) 
    if e := json.Unmarshal(data2, &f); e != nil { 
     fmt.Println("Error:", e) 
    } 
    fmt.Println(f, f.Encoding) 
} 

出力:

{UID 10 CONTENT ASCII qwe} ASCII 
{UID 10 CONTENT base64 qwe} base64 

の作業コード:https://play.golang.org/p/y5_wBgHGJk

5

あなたはあなたの「FILEDATA」
を初期化するときには、私の例を参照してください。デフォルト値を設定することができます。https://play.golang.org/p/QXwDG7_mul
Page intはデフォルト値33

 
package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Response2 struct { 
    Page int  `json:"page"` 
    Fruits []string `json:"fruits"` 
} 

func main() { 
    str := `{"fruits": ["apple", "peach"]}` 
    res := Response2{Page: 33 /*Default value*/} 
    json.Unmarshal([]byte(str), &res) 
    fmt.Println(res) 
} 
関連する問題