Как обрабатывать разные типы в ответе JSON на голанге или типизированном языке в целом - PullRequest
0 голосов
/ 03 июля 2018

Я работаю над проектом в golang, и мне нужно работать с ответом JSON. Дело в том, что значение в JSON, поступающее с сервера, может быть что-то вроде

{person: "john"} 

или

{person: {name:"john"}} 

поэтому для создания структуры для захвата этого у меня есть несколько вариантов:

1) сделать тип человека как интерфейс {}, но позже у него будет избыточный код для работы со значением

2) хранить значения в новых свойствах, таких как PersonAsString и PersonAsObject, это делает код немного более непредсказуемым, так как он предназначен для использования в качестве модуля для других разработчиков

есть ли другие плюсы и минусы для этого? какие-нибудь другие предложения, как рассматривать поля JSON неизвестного типа?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Другой вариант - определить тип с помощью пользовательских функций маршала и демаршала JSON.

type Person string

func (p *Person) UnmarshalJSON(b []byte) error {
    if strings.HasPrefix(string(*p),"{"){
        value := map[string]string{}
        json.Unmarshal(b,&value)
        *p = Person(value["name"])
    }else{
        *p = Person(b)
    }
    return nil
}

func (p Person) MarshalJSON() ([]byte, error) {
    return []byte(p),nil
}


type PersonStruct struct{
    Person  Person `json:"person"`
}

func main(){
    one := `{"person": "john"}`
    two := `{"person": {name:"john"}}`
    result := PersonStruct{}
    json.Unmarshal([]byte(one),&result)
    fmt.Println(result)
    json.Unmarshal([]byte(two),&result)
    fmt.Println(result)
}
0 голосов
/ 03 июля 2018

В этом случае вы должны использовать interface{}.
Но с целью уменьшения сложности вашей структуры вы можете иметь одно дополнительное поле, например NameValue, и заполнить это значение после json.Unmarshal и присвоить значение или из person либо из person.name.
В вашем коде вы можете свободно использовать NameValue, который всегда будет содержать правильное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...