简介

json是一种数据交换的格式,在前后端的交互中有广泛的应用。我们来举一个例子

package main

import (
    "encoding/json"
    "fmt"
)

type people struct {
    Name string `json:"name"`
    age  int
    Sex  string `json:"sex"`
    Car1 *Car
}
type Car struct {
    Logo string `json:"logo"`
}

func main() {
    var p1 people
    p1.Name = "hahaha"
    p1.Sex = "男"
    p1.age = 12

    var car1 Car
    car1.Logo = "大众"
    p1.Car1 = &car1
    s, _ := json.Marshal(p1)
    fmt.Print(string(s))
}

代码运行的结果是

{"name":"hahaha","sex":"男","Car1":{"logo":"大众"}}

我们所能得出的结论是:

首字母未大写的成员不可被转换成json形式
转换成json后会自动使用变量的标签作为名称
指针变量会自动转化成为所指向的对象

json的解析

json.Unmarshal(s, &p2)
    fmt.Print(p2)
    fmt.Print(p2.Car1.Logo)

{hahaha 0 男 0xc000056330}大众
由此可见,虽然在json中显示了指针所指向的对象,但是,指针变量解析出来还是一个指针,若遇到不存在的项则自动设为0值
Marshal函数只有在转换成功的时候才会返回数据,在转换的过程中我们需要注意几点:
JSON对象只支持string作为key,所以要编码一个map,那么必须是map[string]T这种类型(T是Go语言中任意的类型)
Channel, complex和function是不能被编码成JSON的
嵌套的数据是不能编码的,不然会让JSON编码进入死循环

json的特殊字符串处理

json对格式的要求非常严格,这也造成了特殊字符串的存取困难,我们在存取前应对特殊字符进行转义

            
        switch (c) {     
        case '\"':     
            sb.append("\\\"");     
            break;     
        case '\\':     
            sb.append("\\\\");     
            break;     
        case '/':     
            sb.append("\\/");     
            break;     
        case '\b':     
            sb.append("\\b");     
            break;     
        case '\f':     
            sb.append("\\f");     
            break;     
        case '\n':     
            sb.append("\\n");     
            break;     
        case '\r':     
            sb.append("\\r");     
            break;     
        case '\t':     
            sb.append("\\t");     
            break;     
        default:     
            sb.append(c);     
    }
Last modification:October 19th, 2019 at 05:24 pm
如果觉得我的文章对你有用,请随意赞赏