Как показать пустой объект вместо пустой структуры или ноль в Go json marshal - PullRequest
0 голосов
/ 02 мая 2018

Мне нужно показать пустой объект JSON {}, когда сделать json.Marshal() для указателя структуры. Я могу вывести только значение null или пустое значение структуры.

Если клавиша person заполнена &Person{} или new(Person), она покажет пустую структуру, как показано ниже:

{
    "data": {
        "person": {
            "name": "",
            "age": 0
        },
        "created_date": "2009-11-10T23:00:00Z"
    }
}

И если мы его вообще не инициализируем, он покажет null.

{
    "data": {
        "person": null,
        "created_date": "2009-11-10T23:00:00Z"
    }
}

Я хочу показать "person": {}. Возможно ли это?

Игровая площадка Go для полного кода: https://play.golang.org/p/tT15G2ESPVc

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Параметр A , используйте параметр тега omitempty во всех полях Person и убедитесь, что поле ответа выделено перед маршалингом.

type Person struct {
    Name string `json:"name,omitempty"`
    Age  int    `json:"age,omitempty"`
}

// ...

resp.Person = new(Person)

https://play.golang.org/p/o3jWdru_8bC


Опция B , использовать тип без указателя тип оболочки, который включает тип указателя Person.

type PersonJSON struct {
    *Person
}

type Response struct {
    Person      PersonJSON `json:"person"`
    CreatedDate time.Time   `json:"created_date"`
}

https://play.golang.org/p/EKQc7uf1_Vk


Опция C , тип Reponse реализует интерфейс json.Marshaler.

func (r *Response) MarshalJSON() ([]byte, error) {
    type tmp Response
    resp := (*tmp)(r)

    var data struct {
        Wrapper struct {
            *Person
        } `json:"person"`
        *tmp
    }
    data.Wrapper.Person = resp.Person
    data.tmp = resp
    return json.Marshal(data)
}

https://play.golang.org/p/1qkSCWZ225j


Могут быть и другие варианты ...

0 голосов
/ 02 мая 2018

В Go пустая структура по определению присваивает нулевые значения элементам поля. Например: для int 0, "" для строки и т. Д.

В вашем случае сработает простое сравнение с нулем. Или вы можете определить emptyPerson как:

 var BAD_AGE = -1
 emptyPerson := &Person{"", BAD_AGE} // BAD_AGE indicates no person
 if person[age] == BAD_AGE {
    // handle case for emptyPerson}
...