Как пропустить пустые поля json, используя json.decoder - PullRequest
0 голосов
/ 11 декабря 2019

Я пытаюсь понять, почему обе функции возвращают один и тот же вывод. Насколько я понял, суть omit empty состоит в том, чтобы не добавлять этот ключ в структуру результата.

Я написал этот пример, я ожидал, что в первом выводе не будет ключа "Empty", но дляпо какой-то причине его значение все еще отображается как 0.

package main

import (
    "encoding/json"
    "fmt"
    "strings"
)

type agentOmitEmpty struct {
    Alias   string `json:"Alias,omitempty"`
    Skilled bool   `json:"Skilled,omitempty"`
    FinID   int32  `json:"FinId,omitempty"`
    Empty   int    `json:"Empty,omitempty"`
}

type agent struct {
    Alias   string `json:"Alias"`
    Skilled bool   `json:"Skilled"`
    FinID   int32  `json:"FinId"`
    Empty   int    `json:"Empty"`
}

func main() {
    jsonString := `{
        "Alias":"Robert",
        "Skilled":true,
        "FinId":12345
    }`

    fmt.Printf("output with omit emtpy: %v\n", withEmpty(strings.NewReader(jsonString)))
    // output with omit emtpy: {Robert true 12345 0}

    fmt.Printf("output regular: %v\n", withoutEmpty(strings.NewReader(jsonString)))
    // output without omit: {Robert true 12345 0}
}

func withEmpty(r *strings.Reader) agentOmitEmpty {
    dec := json.NewDecoder(r)
    body := agentOmitEmpty{}
    err := dec.Decode(&body)
    if err != nil {
        panic(err)
    }
    return body
}

func withoutEmpty(r *strings.Reader) agent {
    dec := json.NewDecoder(r)
    body := agent{}
    err := dec.Decode(&body)
    if err != nil {
        panic(err)
    }
    return body
}

1 Ответ

3 голосов
/ 11 декабря 2019

Вам нужно определить Empty как *int, поэтому он будет заменен на nil, если значение не указано. Тогда он не будет сохранен в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...