我如何解组JSON?

sat*_*sat 6 json go

我还在学习Go.我试图将json解组成一个struct.但是,struct有一个带标记的字段.使用反射,我试着看看标签中是否有字符串"json".如果确实如此,那么json to unmarshal应该简单地作为字符串解组到字段中.

例:

const data = `{"I":3, "S":{"phone": {"sales": "2223334444"}}}`
type A struct {
    I int64
    S string `sql:"type:json"`
}
Run Code Online (Sandbox Code Playgroud)

问题很简单 - 将json中的"S"解组为结构A中的字符串.

这就是我走了多远.但我被困在这里.

http://play.golang.org/p/YzrhjuXxGN

Nic*_*ood 11

这是去做的方式 - 不需要反思.创建一个新类型RawString并为其创建MarshalJSONUnmarshalJSON方法.(游乐场)

// RawString is a raw encoded JSON object.
// It implements Marshaler and Unmarshaler and can
// be used to delay JSON decoding or precompute a JSON encoding.
type RawString string

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawString) MarshalJSON() ([]byte, error) {
    return []byte(*m), nil
}

// UnmarshalJSON sets *m to a copy of data.
func (m *RawString) UnmarshalJSON(data []byte) error {
    if m == nil {
        return errors.New("RawString: UnmarshalJSON on nil pointer")
    }
    *m += RawString(data)
    return nil
}

const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

type A struct {
    I int64
    S RawString `sql:"type:json"`
}

func main() {
    a := A{}
    err := json.Unmarshal([]byte(data), &a)
    if err != nil {
        log.Fatal("Unmarshal failed", err)
    }
    fmt.Println("Done", a)
}
Run Code Online (Sandbox Code Playgroud)

我修改了RawMessage的实现来创建上面的内容.