-2

I have a struct what I need to marshal to consume the webservice, but in my tests I the Marshal function only encode one field:

type DataRows []struct {
    mData interface{}
}

type DataColumns []struct {
    mColumnName      string
    mColumnType      int
    mColumnPrecision int
    mColumnScale     int
}
type DataTables []struct {
    mDataColumns DataColumns
    mDataRows    DataRows
    mIndex       int
}

type CFFDataSet struct {
    mDataTables DataTables
    mUser       string
    DBServer    int
}

func main() {
    ds := CFFDataSet{
        mDataTables: DataTables{{
            mDataColumns: DataColumns{{
                mColumnName:      "Test",
                mColumnType:      1,
                mColumnPrecision: 1,
                mColumnScale:     1,
            }},
            mDataRows: DataRows{{
                mData: "Test",
            }},
            mIndex: 0,
        }},
        mUser:    "Teste",
        DBServer: 2,
    }

    marchaled, _ := json.Marshal(ds)
    fmt.Println(string(marchaled))
}

is returning

$ go run getrest.go
{"DBServer":2}

Can someone give me a hint why not this working ?

Pedo Souza
  • 28
  • 5

1 Answers1

1

All your other fields are unexported (like private in other languages) and the unmarshaller can't access them. This is designated by the case of the first letter in the field name, needs to be uppercase.

For reference, here's an example using a field name on your struct that differs from the json's field name;

var jsonBlob = []byte(`[
    {"Name": "Platypus", "Purchase": "Monotremata"},
    {"Name": "Quoll",    "Purchase": "Dasyuromorphia"}
]`)
type Animal struct {
    Name  string
    Order string `json:"Purchase"`
}
var animals []Animal
err := json.Unmarshal(jsonBlob, &animals)
if err != nil {
    fmt.Println("error:", err)
}
fmt.Printf("%+v", animals)

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

evanmcdonnal
  • 46,131
  • 16
  • 104
  • 115