Как опустить условное поле структуры внутри маршала - PullRequest
0 голосов
/ 11 ноября 2018

Существует структура MyStruct .

type MyStruct struct {
    Code        int   `json:"Code"`
    Flags       uint8 `json:"Flags"`
    OptionField int   `json:",omitempty"`
}

Следующий код конвертирует его в json.

f := MyStruct{Code:500, OptionField:41}
r, _ := json.Marshal(f)
fmt.Println(string(r)

Мне нужно, чтобы «OptionField» был необязательным. Некоторое время он должен существовать в json с одним из значений [0, 1, 2, 3,]. а в другое время его следует исключить из json.

Моя проблема: omitempty исключит его, когда значение равно нулю, а значение по умолчанию для int равно нулю. Есть ли способ опустить поле в условии (например: пропустить, если значение равно -1). Или есть способ сделать это.

1 Ответ

0 голосов
/ 11 ноября 2018

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

package main

import (
    "encoding/json"
    "fmt"
)

type MyStruct struct {
    Code        int   `json:"Code"`
    Flags       uint8 `json:"Flags"`
    OptionField *int  `json:",omitempty"`
}

func format(s MyStruct) string {
    r, _ := json.Marshal(s)
    return string(r)
}

func main() {
    f := MyStruct{Code: 500, Flags: 10, OptionField: new(int)}
    fmt.Println(format(f)) // {"Code":500,"Flags":10,"OptionField":0}
    f.OptionField = nil
    fmt.Println(format(f)) // {"Code":500,"Flags":10}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...