package model
import (
"encoding/json"
"fmt"
)
type Test struct {
Name string `json:"name" `
Number TestNumberType `json:"number,omitempty" `
Test2 []Test2 `json:"test2,omitempty" `
Ontology Ontology `json:"ontology,omitempty" `
}
type Test2 struct {
Names []string `json:"names,omitempty" `
Number float64 `json:"number,omitempty" `
}
type Ontology string
const (
ECO Ontology = "https://www.evidenceontology.org/term/"
GO Ontology = "https://amigo.geneontology.org/amigo/term/"
SIO Ontology = "http://semanticscience.org/resource/"
)
type TestNumberType struct {
Float float64
String string
}
func (t *TestNumberType) UnmarshalJSON(data []byte) error {
t.Float = 0
t.String = ""
var floatValue float64
if err := json.Unmarshal(data, &floatValue); err == nil {
t.Float = floatValue
return nil
}
var stringValue string
if err := json.Unmarshal(data, &stringValue); err == nil {
t.String = stringValue
return nil
}
return fmt.Errorf("TestNumberType: data is neither float, string")
}
func (t TestNumberType) MarshalJSON() ([]byte, error) {
if t.Float != 0 {
return json.Marshal(t.Float)
}
if t.String != "" {
return json.Marshal(t.String)
}
return []byte("null"), nil
}