2017-09-17 10 views
0

おそらくnilデータベースタイプのカスタムマーシャラを作成しようとしています。それはsql.NullFloat64タイプとまったく同じように構成されています空のカスタムタイプのJSONを省略

マーシャリングされる struct大きなの一部である
type NullFloat64 sql.NullFloat64 

func (ni *NullFloat64) MarshalJSON() ([]byte, error) { 
    if !ni.Valid { 
     return []byte("null"), nil 
    } 
    return json.Marshal(ni.Float64) 
} 

type Data struct { 
    X time.Time `json:"x"` 
    Y float32 `json:"y"` 
    Stderr NullFloat64 `json:"stderr"` 
} 

私はjson.Marshal()このstructにしようとすると、それが正常に動作しますが、作成:値がnullある場合

{"x":"2017-01-12T23:36:12-05:00","y":4,"stderr":null} 

を私は完全にJSONのキーを省略したいと思います。私はjson:"stderr,omitempty"Dataに追加しました。提案hereパー

、私はちょうどMarshalJSONからnil値を返す試みたが、得た:

json: error calling MarshalJSON for type common.NullFloat64: unexpected end of JSON input 

私としてもDataを更新してみました:

type Data struct { 
    X time.Time `json:"x"` 
    Y float32 `json:"y"` 
    Stderr *NullFloat64 `json:"stderr,omitempty"` 
} 

そしてマーシャリング:

Data { 
    X: datetime, 
    Y: value, 
    Stderr: &stderr, 
} 

同じエラーが発生しました以前のようにnilMarshalJSONから返すとき。

したがって、カスタムタイプにMarshalJSONを実装して、マーシャリング時にキーを省略するにはどうすればよいですか? 助けてくれてありがとう!あなたが作成した場合

答えて

0

あなたはそうのように入力します。

Data { 
    X: datetime, 
    Y: value, 
    Stderr: nil, 
} 

omitemptyは「正しいことを行う」のキックとなります。残念ながら、私はこれがあなたを助けないと確信しています。

実際にフィールドベースの状態と内部状態を省略したい場合は、その子ではなく構造体にjson.Marshallerを実装する必要があります。これを行う最も簡単な方法は次のとおりです。

func (d Data) MarshalJSON() ([]byte, error) { 
    if !d.Stderr.Valid { 
     return json.Marshal(Data{d.X, d.Y, nil}) 
    } 
    return json.Marshal(d) 
} 
関連する問題