Просто создайте тип с обоими присутствующими полями:
type MyType struct {
Foo *fooStruct `json:"foo,omitempty"`
Bar *barStruct `json:"bar,omitempty"`
OtherKey string `json:"other_key"`
}
Распакуйте JSON в этот тип и просто проверьте, что ig Foo
и или Bar
равны нулю, чтобы знать, с какими данными вы работаетес.
Вот игровая площадка Демонстрация того, на что это будет похоже
Суть этого:
type Foo struct {
Field int `json:"field1"`
}
type Bar struct {
Message string `json:"field2"`
}
type Payload struct {
Foo *Foo `json:"foo,omitempty"`
Bar *Bar `json:"bar,omitempty"`
Other string `json:"another_field"`
}
Foo
иBar
поля являются типами указателей, потому что поля значений сделают его немного более громоздким, чтобы определить, какое поле было фактически установлено.Бит omitempty
позволяет вам маршалировать тот же тип, чтобы воссоздать исходную полезную нагрузку, поскольку значения nil
просто не будут отображаться в выходных данных.
Чтобы проверить, какое поле было установлено в исходной строке JSON,просто напишите:
var data Payload
if err := json.Unmarshal([]byte(jsonString), &data); err != nil {
// handle error
}
if data.Foo == nil && data.Bar == nil {
// this is probably an error-case you need to handle
}
if data.Foo == nil {
fmt.Println("Bar was set")
} else {
fmt.Println("Foo was set")
}
Не более того