web-dev-qa-db-fra.com

Affectation de valeurs null à des champs JSON au lieu de chaînes vides dans Golang

Puisque la chaîne vide est la valeur zéro/par défaut pour Golang string, j'ai décidé de définir tous ces champs tels que interface{} à la place. par exemple 

type student struct {
    FirstName  interface{} `json:"first_name"`
    MiddleName interface{} `json:"middle_name"`
    LastName   interface{} `json:"last_name"`
}

L’application que j’envoie mes données s’attend à une valeur null au lieu d’une chaîne vide si la valeur n’est pas disponible pour ce champ spécifique.

Est-ce la bonne approche ou quelqu'un peut-il m'indiquer quelque chose de mieux que cela? 

27
Prashant

Dans documentation du paquet json :

Les valeurs de pointeur sont codées comme la valeur indiquée. Un pointeur nil code en tant qu'objet JSON nul.

Ainsi, vous pouvez stocker un pointeur sur une chaîne qui sera codée sous forme de chaîne si non nil et codée comme "null" si nil 

type student struct {
  FirstName  *string `json:"first_name"`
  MiddleName *string `json:"middle_name"`
  LastName   *string `json:"last_name"`
}
45
Asdine

Peut être utilisé https://github.com/guregu/null

type student struct {
FirstName  null.String `json:"first_name"`
MiddleName null.String `json:"middle_name"`
LastName   null.String `json:"last_name"`}
0
user3235610

Une autre solution consiste en fait à contourner la solution d’interface MarhshalJSON et UnmarshalJSON proposée par json lib de golang. Le code est comme ci-dessous: 

type MyType string
type MyStruct struct {
    A MyType `json:"my_type"`
}

func (c MyType) MarshalJSON() ([]byte, error) {
    var buf bytes.Buffer
    if len(string(c)) == 0 {
        buf.WriteString(`null`)
    } else {
        buf.WriteString(`"` + string(c) + `"`)   // add double quation mark as json format required
    }
    return buf.Bytes(), nil
}

func (c *MyType)UnmarshalJSON(in []byte) error {
    str := string(in)
    if str == `null` {
        *c = ""
        return nil
    }
    res := MyType(str)
    if len(res) >= 2 {
        res = res[1:len(res)-1]     // remove the wrapped qutation
    }
    *c = res
    return nil
}

puis, lors de l'utilisation de json.Marshal, la valeur de MyType sera marshalée comme nulle.

0
Chao