json - 我如何解码 JSON?

标签 json go

我正在尝试将 JSON 解码为一个结构。但是,该结构有一个带有标签的字段。使用反射,我尝试查看标签中是否包含字符串“json”。如果是这样,那么要解码的 json 应该作为字符串简单地解码到字段中。

例子:

const data = `{"I":3, "S":{"phone": {"sales": "2223334444"}}}`
type A struct {
    I int64
    S string `sql:"type:json"`
}

问题很简单——将 json 中的“S”作为字符串解码到结构 A 中。

这就是我的进步。但我被困在这里。

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

最佳答案

这是执行此操作的可行方法 - 无需反射。创建一个新类型 RawString 并为其创建 MarshalJSONUnmarshalJSON 方法。 ( playground )

// 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)
}

我修改了 RawMessage 的实现创建以上内容。

关于json - 我如何解码 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23798283/

相关文章:

ruby-on-rails - 无法在 Rails 3 中将 String 和 Fixnum 转换为 JSON

javascript - 将 javascript 对象键与输入值进行比较

javascript - 将有序 JSON 响应结果解析为无序对象

linux - Golang 插件热重载

arrays - 从golang模板调用数组的方法

javascript - 如何显示来自 JsonRestStore 的数据

java - 期望一个对象数组,但得到一个对象中的一个对象

windows - Go 编译器可以安装在 Windows 上吗?

function - 对于获取对象但可能找不到它的函数,最好的 func 签名是什么?

go - 从 router.HandleFunc 调用返回多个中间件函数