2014-10-31 4 views
1

Я пытаюсь разобрать файл узла package.json в golang, и я получил следующую структуру:демаршалинга объект JSON верхнего уровня в golang

type packageJson struct { 
    scripts   map[string]interface{} `json:"scripts"` 
    dependencies map[string]interface{} `json:"dependencies"` 
    devDependencies map[string]interface{} `json:"devDependencies"` 
} 

... 

var content packageJson 
if err := json.Unmarshal(b, &content); err != nil { 
    return err 
} 

Когда я анализирую файл пакета, однако структура не заполняется (хотя и не получается ошибка). Я подозреваю, что это потому, что контент является самим объектом (то есть: { "scripts":"...", ... }), а метод Unmarshal хочет преобразовать его в map[string]interface{}. Любые предложения, как обойти эту «проблему»? Я попытался создать структуру-оболочку и использовать jpath, но безрезультатно. Благодаря!

Примечание: Я мог бы сделать это

var content map[string]interface{} 
... 
if val, ok := content["scripts"]; !ok { ... } 

, но я хотел бы избежать, если это возможно.

ответ

3

Вы должны сделать открытыми поля структуры.

+0

Я думал, что видимость не имеет значения, но я думаю, это потому, что Unmarshal принимает указатель и выходит за рамки. Он работает сейчас! Благодарю. – morcmarc

+1

Это связано с тем, что не экспортируемые поля не могут быть доступны никакими другими пакетами даже с отражением. – Matt

+0

Видимость связана с тем, что unmarshaller использует отражение и просто не сможет получить доступ к закрытым полям. Здесь обсуждается этот вопрос: http://stackoverflow.com/questions/11126793/golang-json-and-dealing-with-unexported-fields –

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