2015-01-30 5 views
3

У меня есть JSON блоб, который выглядит как этотjson.Unmarshal возвращение пустой структуры

{ 
    "metadata":{ 
     "id":"2377f625-619b-4e20-90af-9a6cbfb80040", 
     "from":"2014-12-30T07:23:42.000Z", 
     "to":"2015-01-14T05:11:51.000Z", 
     "entryCount":801, 
     "size":821472, 
     "deprecated":false 
    }, 
    "status":[{ 
     "node_id":"de713614-be3d-4c39-a3f8-1154957e46a6", 
     "status":"PUBLISHED" 
    }] 
} 

и у меня есть немного кода, чтобы преобразовать, что обратно в гоу структур

type Status struct { 
    status string 
    node_id string 
} 

type Meta struct { 
    to string 
    from string 
    id string 
    entryCount int64 
    size int64 
    depricated bool 
} 

type Mydata struct { 
    met meta 
    stat []status 
} 

var realdata Mydata 
err1 := json.Unmarshal(data, &realdata) 
if err1 != nil { 
    fmt.Println("error:", err1) 
} 
fmt.Printf("%T: %+v\n", realdata, realdata) 

но то, что я вижу, когда Я бегу это просто обнуляется структура

main.Mydata: {met:{to: from: id: entryCount:0 size:0 depricated:false} stat:[]} 

Я попытался расПредеЛение структура первого, но это тоже не работает, я не уверен, почему он не производит значения и не возвращает ошибку

ответ

18

Ваши поля структуры не экспортируются. Это происходит потому, что они начинаются с строчной буквы.

EntryCount // <--- Exported 
entryCount // <--- Not exported 

Когда я говорю «не экспортировано», я имею в виду, что они не видны за пределами вашего пакета. Ваш пакет может с радостью получить к ним доступ, поскольку они локально привязаны к нему.

Что касается пакета encoding/json, хотя - он их не видит. Вы должны сделать все ваши поля видимых на encoding/json пакета, делая их все начинают с прописной буквы, в результате чего их экспорт:

type Status struct { 
    Status string 
    Node_id string 
} 

type Meta struct { 
    To   string 
    From  string 
    Id   string 
    EntryCount int64 
    Size  int64 
    Depricated bool 
} 

type Mydata struct { 
    Metadata Meta 
    Status []Status 
} 

See it working on the Go Playground here

Вы также должны ссылаться на спецификацию Golang для ответов , В частности, the part that talks about Exported Identifiers.

+0

Downvoter хочет прокомментировать? –

+1

Это не должно быть ниспровергнуто, но вы должны указать значения тега json для предоставления маршалированного json желаемого имени. например 'json:" entry_count "' – sberry

+0

Извинения. Исправлена. Я написал это после тяжелых обсуждений кода на работе (где я - разработчик .NET). –

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