Мои структуры не сортируются в json - программирование
Подтвердить что ты не робот

Мои структуры не сортируются в json

Я использую Go 1.0.3 в Mac OS X 10.8.2, и я экспериментирую с пакетом json, пытаясь упорядочить структуру json, но я продолжаю получать пустой объект {} json.

Значение err равно nil, поэтому в соответствии с функцией json.Marshal ничего не происходит, и структура правильная. Почему это происходит?

package main

import (
  "encoding/json"
  "fmt"
)

type Address struct {
  street string
  extended string
  city string
  state string
  zip string
}

type Name struct {
  first string
  middle string
  last string
}

type Person struct {
  name Name
  age int
  address Address
  phone string
}

func main() {
  myname := Name{"Alfred", "H", "Eigenface"}
  myaddr := Address{"42 Place Rd", "Unit 2i", "Placeton", "ST", "00921"}
  me := Person{myname, 24, myaddr, "000 555-0001"}

  b, err := json.Marshal(me)

  if err != nil {
    fmt.Println(err)
  }

  fmt.Println(string(b))    // err is nil, but b is empty, why?
  fmt.Println("\n")
  fmt.Println(me)           // me is as expected, full of data
}
4b9b3361

Ответ 1

Вы должны сделать поля, которые вы хотите сделать публичными. Как это:

type Address struct {
  Street string
  Extended string
  City string
  State string
  Zip string
}

err равна nil потому что все экспортированные поля, в данном случае их нет, были правильно распределены.

Рабочий пример: https://play.golang.org/p/9NH9Bog8_C6

Проверьте документы http://godoc.org/encoding/json/#Marshal

Ответ 2

Обратите внимание, что вы также можете управлять тем, что имя полей в сгенерированном JSON выполняется следующим образом:

type Name struct {
  First string `json:"firstname"`
  Middle string `json:"middlename"`
  Last string `json:"lastname"` 
}

Ответ 3

Библиотека JSON не может просматривать поля в структуре, если они не являются открытыми. В твоем случае,

type Person struct {
  name Name
  age int
  address Address
  phone string
}

Имя поля, возраст, адрес и телефон не являются общедоступными (начните с маленькой буквы). В golang переменные/функции общедоступны, когда они начинаются с заглавной буквы. Таким образом, чтобы это работало, ваша структура должна выглядеть примерно так:

type Person struct {
  Name Name
  Age int
  Address Address
  Phone string
}