2016-11-03 1 views
-1

У меня есть следующие структурыКак проверить наличие ключа в вложенной структуры

type GiphyJson struct { 
     Type string `json:"type"` 
     Data []struct { 
      Images struct { 
       Fixed_height struct { 
        Url string `json:"url"` 
       } `json:"fixed_height"` 
      } `json:"images"` 
     } `json:"data"` 
    } 

и мне нужно, чтобы получить доступ Data[x].Images.Fixed_height.Url. В идеале я хотел бы проверить наличие каждой из «Свойства данных», «Изображения», «Исправлена» перед доступом к Url, чтобы убедиться, что у меня нет исключений указателей на nil. Поскольку я довольно новичок в языке, мне было любопытно, каким будет идиоматический способ сделать это.

Ниже описано, как я использую структуру.

var err error 
var giphyJson GiphyJson 
keyword = url.QueryEscape(keyword) 
resp, err := http.Get("http://api.giphy.com/v1/gifs/search?q=" + keyword + "&api_key=dc6zaTOxFJmzC&limit=100") 
if err != nil { 
    err = errors.New("An error occured trying to contact giphy") 
    return "", err 
} 
defer resp.Body.Close() 
bodyBytes, err := ioutil.ReadAll(resp.Body) 
err = json.Unmarshal(bodyBytes, &giphyJson) 
+0

Ответ зависит исключительно от типа, в который вы размонтируете свой JSON. Например. если структура struct не содержит указателей, то исключение исключений nil не может быть. Пожалуйста, покажите код. – Volker

+0

@ Волкир не так, что определение структур? У него нет указателей ... на OP, единственное, что вам действительно нужно проверить, это то, что 'lenght (Data)> x' – evanmcdonnal

+0

В вышеприведенной структуре вы должны проверить, что len (data)> 0; Изображения, Fixed_height и Url всегда будут иметь значения (даже если они не существуют в JSON, они будут инициализированы до нулевого значения в структуре). –

ответ

2

Единственный необходимый контроль (на основании определения этой структуры) является то, что len(Data) > x. Кроме того, все является типом значения, поэтому нет риска возникновения панической паники.

if len(Data) > x { 
    // access 
    fmt.Println(Data[x].Images.Fixed_height.Url) 
} else { 
    // do other stuff you to mitigate unexpected input 
}