2017-02-06 4 views
-1

Вот аналогичный пример: Parsing JSON in GoLang into struct Я получаю ответ json от сервера, и мне нужно только получить определенные данные. Я создал пример кода:Как разобрать структуры в golang и распечатать элементы из структуры?

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type response struct { 
    Response []struct { 
     Stats struct { 
      A int `json:"a"` 
      B float64 `json:"b"` 
      C int `json:"c"` 
      D float64 `json:"d"` 
      E float64 `json:"e"` 
      F float64 `json:"f"` 
      G float64 `json:"g"` 
      H float64 `json:"h"` 
      I float64 `json:"i"` 
      J float64 `json:"j"` 
     } `json:"stats"` 
     Data []struct { 
      Num0 int64 `json:"0"` 
      Num1 interface{} `json:"1"` 
     } `json:"data"` 
    } `json:"response"` 
} 


func main() { 
    src := ` 
{ 
    "response": [{ 
      "stats": { 
       "a": 458, 
       "b": 302.3738, 
       "c": 0, 
       "d": 706.777, 
       "e": 2.423, 
       "f": 238.73375, 
       "g": 68.971, 
       "h": 85.1989781659389, 
       "i": 84.6381777592766, 
       "j": 292658.49 
      }, 
      "data": [ 
       [1453222860000, null], 
       [1453223160000, 3.769], 
       [1453223220000, 37.464] 
      ] 
     } 
    ] 
} 
` 

    var g response 
    json.Unmarshal([]byte(src), &g) 
    fmt.Println(g.Response[0].Stats) 
} 

Выход я получаю

`{458 302.3738 0 706.777 2.423 238.73375 68.971 85.1989781659389 84.6381777592766 292658.49} 

`

Я хочу, чтобы получить определенные элементы из только стат структуры. Предположим, я хочу напечатать значение A или J из структуры статистики. Как мне это сделать? Мне действительно не нужна структура данных. Ответ json, который я получил с сервера, дал мне эти данные, но мне это действительно не нужно. В любом случае, мой вопрос заключается в том, как получить только определенные элементы только в структуре Stats?

Любое предложение о том, как это сделать или даже улучшить формат моей структуры? Спасибо!

+0

Вам не нужно просто добавить '.A' в конец текущей печати, чтобы получить поле' A'? – squiguy

+0

Я пытался это сделать, но по какой-то причине это не сработало. Во всяком случае, спасибо за помощь. Комментарий ниже решил мою проблему. – shishh03

ответ

1

Вы можете просто опустить любую часть структуры, о которой вы не заботитесь. Пакет JSON будет молча игнорировать все, что присутствует в исходном JSON, которого нет в структуре назначения. Таким образом, если вы не заботитесь о части данных, опустите ее из структуры. Если вы только заботитесь о A и J в разделе статистики, включите их только.

type response struct { 
    Response []struct { 
     Stats struct { 
      A int `json:"a"` 
      J float64 `json:"j"` 
     } `json:"stats"` 
    } `json:"response"` 
} 

https://play.golang.org/p/W3bmlf15sF

Edit: Также стоит отметить, что вам не нужно включать теги STRUCT, если они только к нижнему регистру имен полей, так как пакет JSON будет соответствовать поля, которые отличаются только по капитализации (хотя он предпочитает точные совпадения, если есть двусмысленность).

+0

Я совершенно новый для Go и структур, но это здорово. Оно работает. Большое спасибо! – shishh03

+0

Что делать, если A является «интерфейсом {}» вместо «int». Мой api-вызов иногда возвращает нулевое значение, и мне нужно иметь возможность обрабатывать этот ответ в структуре. Я знаю, как хранить «J» float64 в переменной, однако, если J равно null, я получаю сообщение об ошибке. Я изменил J float64 на J-интерфейс {}. Но не уверен, как сохранить значение интерфейса {} для переменной – shishh03

+0

Если 'J' является' интерфейсом {} ', вам нужно проверить его на nil, а затем называть его любым типом. Пример: https://play.golang.org/p/inXq03UDUL – Kaedys

Смежные вопросы