JSON

Go学习笔记:json处理(3)

字号+ 作者:H5之家 来源:H5之家 2017-04-20 18:00 我要评论( )

[plain]view plain typeMessagestruct{ Namestring Bodystring Timeint64 innerstring } varm=Message{ Name:Alice, Body:Hello, Time:1294706395881547000, inner:ok, } b:=[]byte(`{nAmE:Bob,Food:Pickle,inner:c

[plain]view plain

  • typeMessagestruct{
  • Namestring
  • Bodystring
  • Timeint64
  • innerstring
  • }
  • varm=Message{
  • Name:"Alice",
  • Body:"Hello",
  • Time:1294706395881547000,
  • inner:"ok",
  • }
  • b:=[]byte(`{"nAmE":"Bob","Food":"Pickle","inner":"changed"}`)
  • err:=json.Unmarshal(b,&m)
  • iferr!=nil{
  • fmt.Printf(err.Error())
  • return
  • }
  • fmt.Printf("%v",m)
  • Output:
  • {BobHello1294706395881547000ok}
  • StructTag

    如果希望手动配置结构体的成员和JSON字段的对应关系,可以在定义结构体的时候给成员打标签:

    使用omitempty熟悉,如果该字段为nil或0值(数字0,字符串"",空数组[]等),则打包的JSON结果不会有这个字段。

    [plain]view plain

  • typeMessagestruct{
  • Namestring`json:"msg_name"`//对应JSON的msg_name
  • Bodystring`json:"body,omitempty"`//如果为空置则忽略字段
  • Timeint64`json:"-"`//直接忽略字段
  • }
  • varm=Message{
  • Name:"Alice",
  • Body:"",
  • Time:1294706395881547000,
  • }
  • data,err:=json.Marshal(m)
  • iferr!=nil{
  • fmt.Printf(err.Error())
  • return
  • }
  • fmt.Println(string(data))
  • Output:
  • {"msg_name":"Alice"}
  • 更灵活地使用JSON

    使用json.RawMessage

    json.RawMessage其实就是[]byte类型的重定义。可以进行强制类型转换。

    现在有这么一种场景,结构体中的其中一个字段的格式是未知的:

    [plain]view plain

  • typeCommandstruct{
  • IDint
  • Cmdstring
  • Args*json.RawMessage
  • }
  • 使用json.RawMessage的话,Args字段在Unmarshal时不会被解析,直接将字节数据赋值给Args。我们可以能先解包第一层的JSON数据,然后根据Cmd的值,再确定Args的具体类型进行第二次Unmarshal。

    这里要注意的是,一定要使用指针类型*json.RawMessage,否则在Args会被认为是[]byte类型,在打包时会被打包成base64编码的字符串。

    使用interface{}

    interface{}类型在Unmarshal时,会自动将JSON转换为对应的数据类型:

    JSON的boolean转换为bool
    JSON的数值转换为float64
    JSON的字符串转换为string
    JSON的Array转换为[]interface{}
    JSON的Object转换为map[string]interface{}
    JSON的null转换为nil

    需要注意的有两个。一个是所有的JSON数值自动转换为float64类型,使用时需要再手动转换为需要的int,int64等类型。第二个是JSON的object自动转换为map[string]interface{}类型,访问时直接用JSON Object的字段名作为key进行访问。再不知道JSON数据的格式时,可以使用interface{}。

    自定义类型

    如果希望自己定义对象的打包解包方式,可以实现以下的接口:

    [plain]view plain

  • typeMarshalerinterface{
  • MarshalJSON()([]byte,error)
  • }
  • typeUnmarshalerinterface{
  • UnmarshalJSON([]byte)error
  • }
  • 实现该接口的对象需要将自己的数据打包和解包。如果实现了该接口,json在打包解包时则会调用自定义的方法,不再对该对象进行其他处理。


     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • golang学习之html json解析

      golang学习之html json解析

      2016-10-30 12:00

    • golang的json操作

      golang的json操作

      2015-11-22 10:36

    • golang json 格式文件解析

      golang json 格式文件解析

      2015-11-03 11:11

    • golang json解析之大小写

      golang json解析之大小写

      2015-10-15 17:30

    网友点评