Подтвердить что ты не робот

JSON golang boolean omitempty

У меня возникли проблемы с написанием библиотеки golang для api. Json-аспект булевых элементов вызывает проблемы.

Предположим, что значение по умолчанию для логического значения истинно для вызова api.

Если я делаю

SomeValue bool `json:some_value,omitempty`

и я не устанавливаю значение через библиотеку, значение будет установлено в true. Если я устанавливаю значение false в библиотеке, omitempty говорит, что ложное значение является пустым значением, поэтому значение будет оставаться верным через вызов api.

Возьмем omitempty и будем выглядеть так:

SomeValue bool `json:some_value`

Теперь у меня есть противоположная проблема, я могу установить значение в false, но если я не установлю значение, значение будет ложным, хотя я ожидаю, что оно будет истинным.

Изменить: как мне поддерживать поведение, когда вам не нужно устанавливать значение true, а также можно установить значение в false?

4b9b3361

Ответ 1

Использовать указатели

package main

import (
    "encoding/json"
    "fmt"
)

type SomeStruct struct {
    SomeValue *bool `json:"some_value,omitempty"`
}

func main() {
    t := new(bool)
    f := new(bool)

    *t = true
    *f = false

    s1, _ := json.Marshal(SomeStruct{nil})
    s2, _ := json.Marshal(SomeStruct{t})
    s3, _ := json.Marshal(SomeStruct{f})

    fmt.Println(string(s1))
    fmt.Println(string(s2))
    fmt.Println(string(s3))
}

Вывод:

{}
{"some_value":true}
{"some_value":false}