golang json处理

序列化:

 1)简单的数据结构:

package main

import (
    "encoding/json"
    "fmt"
    "reflect"
)

type School struct {
    Name     string        `json:"name"`
    Location string     `json:"location"`
}

func main()  {
    school := School{
        Name:     "某某学校",
        Location: "市区",
    }

    str, err := json.Marshal(school)

    if err !=nil {
        fmt.Printf("json序列化失败%v", err)
    }

    fmt.Println(str)    //返回结果[123 34 110 97 109 101 34 58 34 230 159 144 230 159 144 229 173 166 230 160 161 34 44 34 108 111 99 97 116 105 111 110 34 58 34 229 184 130 229 140 186 34 125]
    fmt.Println(reflect.TypeOf(str))    //返回结果[]uint8
    fmt.Println(string(str))    //返回结果{"name":"某某学校","location":"市区"}
}

解释一下demo中最后为什么要经过string转换一个才能打印出最后的结果:json.Marshal最后返回的结果是byte类型的切片结果,byte和string是可以相互转换的。

2)结构体嵌套:  

package main

import (
    "encoding/json"
    "fmt"
)

type Classroom struct {
    Number int64    `json:"number"`
    Floor  int32    `json:"floor"`
}

type School struct {
    Name     string        `json:"name"`
    Location string     `json:"location"`
    Classroom Classroom `json:"classroom"`
}

func main()  {
    school := School{
        Name:      "某某学校",
        Location:  "市区",
        Classroom:Classroom{
            Number: 201,
            Floor:  2,
        },
    }

    str, err := json.Marshal(school)

    if err !=nil {
        fmt.Printf("json序列化失败%v", err)
    }

    fmt.Println(string(str))    //返回结果 {"name":"某某学校","location":"市区","classroom":{"number":201,"floor":2}}
}

school中嵌套一个classroom的结构体,初始化赋值后便可以直接序列化。

3)不定义结构体的做法:

package main

import (
    "encoding/json"
    "fmt"
)

func main()  {
    school := map[string]interface{}{
        "name" : "某某学校",
        "location" : "市区",
        "classroom" : map[string]interface{}{
            "number" : 201,
            "floor" : 2,
        },
    }

    str, err := json.Marshal(school)

    if err !=nil {
        fmt.Printf("json序列化失败%v", err)
    }

    fmt.Println(string(str))    //返回结果 {"name":"某某学校","location":"市区","classroom":{"number":201,"floor":2}}
}

可以直接初始化赋值后序列化。

反序列化

1)简单结构:

package main

import (
    "encoding/json"
    "fmt"
)

type Classroom struct {
    Number int64    `json:"number"`
    Floor  int32    `json:"floor"`
}

type School struct {
    Name     string        `json:"name"`
    Location string     `json:"location"`
    Classroom Classroom `json:"classroom"`
}

func main()  {
    str := `{"name":"某某学校","location":"市区","classroom":{"number":201,"floor":2}}`
    var school School
    json.Unmarshal([]byte(str), &school)    //func Unmarshal(data []byte, v interface{}) error {
    fmt.Println(school)    //返回结果 {某某学校 市区 {201 2}}
    fmt.Printf(`name:%s, location:%s, classroom:%v, number:%d, floor:%d`,
        school.Name, school.Location, school.Classroom, school.Classroom.Number, school.Classroom.Floor)    //name:某某学校, location:市区, classroom:{201 2}, number:201, floor:2
}

Unmarshal 传值第一个需要传一个byte的切片过去不能直接传str类型,str类型和byte是可以相互转化的。前面的例子序列化的时候返回的结果也是byte类型,是我们自己转换成str的。

第二个参数需要传个结构体指针过去,如果直接传值的话,序列化的是个副本得不到最终的结果。

2)直接反序列化

package main

import (
    "encoding/json"
    "fmt"
    "reflect"
)

func main()  {
    str := `{"name":"某某学校","location":"市区","classroom":{"number":201,"floor":2}}`
    var school interface{}
    json.Unmarshal([]byte(str), &school)    //func Unmarshal(data []byte, v interface{}) error {
    fmt.Println(school)    //返回结果 map[classroom:map[floor:2 number:201] location:市区 name:某某学校]
    //fmt.Println(school.name)    //编译报错 school.name undefined (type interface {} is interface with no methods)
    //fmt.Println(school["name"])    //编译报错 invalid operation: school["name"] (type interface {} does not support indexing)

    val, ok := school.(map[string]interface{})

    if !ok {
        fmt.Println("type is not ok")
        return
    }

    fmt.Println(val["name"])    //返回结果  某某学校
    fmt.Println(val["classroom"])    //返回结果 map[floor:2 number:201]

    //fmt.Println(val["classroom"]["number"])    //编译报错  invalid operation: val["classroom"]["number"] (type interface {} does not support indexing)

    classroom, ok := val["classroom"].(map[string]interface{})

    if !ok {
        fmt.Println("type is not ok")
        return
    }

    fmt.Println(classroom["number"])    //返回结果 201
    fmt.Println(reflect.TypeOf(classroom["number"]))    //返回结果 float64
}

如果不想定义数据结构,可以先定义一个空接口直接反序列化,但是反序列化后直接取值会编译错误,所以要先断言一下map类型。

golang json处理

原文地址:https://www.cnblogs.com/smallbo/p/12318282.html

时间: 2024-08-29 22:47:54

golang json处理的相关文章

golang json处理struct未导出成员

我们用golang的json来marshal一个结构体的时候,结构体的未导出的成员将无法被json访问,也就是不会出现json编码的结果里(也就是小写的成员没法导出) 这个是由于技术的上问题引起的:golang的结构体里的成员的名字如果以小写字母开头,那么其他的包是无法访问的,也就是json无法访问我们的结构体里小写字母开头的成员 这个可以有两种方法解决 1. struct的成员用大写开头,然后加tag 2. 实现json.Marshaler接口 第一种方法比较常见这儿就不详细展开了 第二种方法

golang json操作

ackage main import ( "encoding/json" "fmt" "os" ) type ConfigStruct struct { Host string `json:"host"` Port int `json:"port"` AnalyticsFile string `json:"analytics_file"` StaticFileVersion int `j

golang json

package main import ( "encoding/json" "fmt" "os" ) type ConfigStruct struct { Expires_in     string `json:"expires_in"` Refresh_token  string `json:"refresh_token"` Access_token   string `json:"access

golang JSON webservice - nginx load balance

func main() { http.HandleFunc("/api", apiHandler) http.HandleFunc("/query/main", mainHandler) http.HandleFunc("/query/show", showHandler) http.HandleFunc("/", mainHandler) http.ListenAndServe(":8081", nil)

再测Golang JSON类库

写项目一直需要进行序列化,听到了,也看到了很多同学老师对各个golang的json库进行测评.那本人为什么还要继续进行这一次测评呢?因为实践过的知识最有说服力,也是属于自己的,我也希望看到本博文的同学老师可以修改和执行测评的代码执行一遍,我相信会有不一定的体会.本次测评我选择了类库有: 类库 序号 类库 地址 备注 1 encoding/json Golan 2 easyjson github.com/mailru/easyjson 3 ffjson github.com/mailru/easy

golang json 编码解码

golang  "encoding/json"包实现了json对象的编解码 一.编码 func Marshal(v interface{}) ([]byte, error) Marshal函数使用下面的基于类型的默认编码格式: 布尔类型编码为json布尔类型. 浮点数.整数和Number类型的值编码为json数字类型. 字符串编码为json字符串.角括号"<"和">"会转义为"\u003c"和"\u003

golang json用法讲解

简介 json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好.但是Go语言是个强类型语言,对格式要求极其严格而JSON格式虽然也有类型,但是并不稳定,Go语言在解析来源为非强类型语言时比如PHP等序列化的JSON时,经常遇到一些问题诸如字段类型变化导致无法正常解析的情况,导致服务不稳定.所以本篇的主要目的 就是挖掘Golang解析json的绝大部分能力 比较优雅的解决解析json时存在的各种问题 深入一下Go

Golang ---json解析

golang官方为我们提供了标准的json解析库–encoding/json,大部分情况下,使用它已经够用了.不过这个解析包有个很大的问题–性能.它不够快,如果我们开发高性能.高并发的网络服务就无法满足,这时就需要高性能的json解析库,目前性能比较高的有json-iterator和easyjson. 现在我们需要引进一个高性能的json解析库,这里以json-iterator为例,但是我们全部换掉又不放心,所以可以先小范围的测试下,这时候我们就需要两个解析库并存,那么这时候我们如何选择我们需要

golang json解析之大小写

package main import ( "encoding/json" "fmt" _ "time" ) type Header struct { FileName  string Host      string Offset    string Timestamp string } type JsonData struct { header string `json:"xx"` Body   string `json: