2016-07-25 5 views
1

Я хочу разобрать следующий JSON вывод:Разбирает в JSON структуру?

{ 
    "total":5689, 
    "result":{ 
     "6581":{ 
      "percent":37.79, 
      "count":2150 
     }, 
     "6591":{ 
      "percent":35.31, 
      "count":2009 
     }, 
     "6601":{ 
      "percent":26.89, 
      "count":1530 
     } 
    } 
} 

Я прочитал, что JSON может быть разобрано в структуры, если формат известен:

package main 

import (
    "encoding/json" 
    "fmt" 
    "os" 
) 

type VoteResult struct { 
    Total int `json:"total"` 
    Result struct { 
     Efid1 struct { 
      Percent float64 `json:"percent"` 
      Count int  `json:"count"` 
     } 
     Efid2 struct { 
      Percent float64 `json:"percent"` 
      Count int  `json:"count"` 
     } 
     Efid3 struct { 
      Percent float64 `json:"percent"` 
      Count int  `json:"count"` 
     } 
    } 
} 

func main() { 
    b := []byte(`{"total":5689,"result":{"6581":{"percent":37.79,"count":2150} 
    ,"6591":{"percent":35.31,"count":2009},"6601":{"percent":26.89,"count":1530}}}`) 

    var v VoteResult 

    err := json.Unmarshal(b, &v) 
    if err != nil { 
     fmt.Fprintf(os.Stderr, "%v\n", err) 
     os.Exit(1) 
    } 

    fmt.Println(v) 
} 

Go Playground

Это вывода, но что-то не так, поскольку вложенные структуры не заполнены данными:

{5689 {{0 0} {0 0} {0 0}}}

Что я делаю неправильно?

ответ

1

result часть JSON - это словарь, отображающий строки для объектов. Попробуйте вместо этого (https://play.golang.org/p/BCNHw-OH2I):

type VoteResult struct { 
    Total int `json:"total"` 
    Result map[string]struct { 
     Percent float64 `json:"percent"` 
     Count int  `json:"count"` 
    } 
} 

EDIT

В качестве альтернативы, если эти строки действительно фиксированы, вы можете сделать это:

type VoteResult struct { 
    Total int `json:"total"` 
    Result struct { 
     Efid1 struct { 
      Percent float64 `json:"percent"` 
      Count int  `json:"count"` 
     } `json:"6581"` 
     Efid2 struct { 
      Percent float64 `json:"percent"` 
      Count int  `json:"count"` 
     } `json:"6591"` 
     Efid3 struct { 
      Percent float64 `json:"percent"` 
      Count int  `json:"count"` 
     } `json:"6601"` 
    } 
} 

Здесь мы просто решили что Efid1 имеет ключ JSON 6591 и т. д. Но я подозреваю, что карта строк для структур лучше подходит для структуры данных, которую у вас есть.

+0

У него просто отсутствует бирка. Изменение его типа данных на что-то динамическое не является хорошим решением этой проблемы. – evanmcdonnal

+0

@evanmcdonnal Я не уверен, что заставляет вас думать об этом. Тег JSON по умолчанию для 'Result' - это' result'. Добавление тега не должно (и не делает, когда я просто его пробовал) имеет значение. – smarx

+0

Да, вы правы, это прекрасно работает, и мой код был неправильным, не читал сообщение достаточно близко. Результат должен быть словарем, потому что у объектов есть ключи. Он мог бы сделать что-то вроде того, что у меня есть, но на самом деле не имеет смысла imo (для трех внутренних структур также нужны теги, и я уверен, что их имена меняются от одного ответа к другому). – evanmcdonnal

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