go语言json处理

json是一种经常使用的数据格式,下面总结一下json的使用
json与struct转换的话struct的属性必须首字母大写。
当用的多了就会发现一个致命的问题:go默认会将特殊字符转义采用以下方法可以解决:

    buffer:=&bytes.Buffer{}
    encoder:=json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    err:=encoder.Encode(data)
    fmt.Println("jsonBytes===", string(buffer.Bytes()))

go内部会将特殊字符自动转义(xml解析也会碰到这种情况)

处理方法1

Bytes:=jsonEncode(jsonBytes,"\\u0026","&")//将\u0026转成&
//解决转码的问题
func jsonEncode(data []byte,oldStr,newStr string) []byte  {
    json:=string(data)
    n:=strings.Count(json, oldStr)
    //n为零时数量不受限制
    str:=strings.Replace(json,oldStr,newStr,n)  //利用string的修改操作,将line换行符脱掉。
    return []byte(str)
}

处理方法2

func TestCreate(t *testing.T) {
    str:=html.UnescapeString("http://m.10010.com/mobilegoodsdetail/311710310946.html?wm_p_id=7414062600021318\u0026wm_channel=cps\u0026wm_c_id=100000\u0026wm_exp=\u0026WT.mc_id=Jituan_100000_1801_dqwm_7414062600021318\u0026utm_source=dqwm\u0026utm_medium=cpa\u0026utm_term=\u0026utm_content=textlink\u0026utm_campaign=Jituan_100000_1801_dqwm_7414062600021318")
    fmt.Println(str)
}

Struct To Json

package main
import (
    "fmt"
    "encoding/json"
)

type User struct {
    //没有后面的tag就会默认为属性名
    Username  string `json:"_"`//如果为下划线就不参与转换
    Password string `json:"password"`
    FriendName []string `json:"friendName"`
}

func main() {
    user:=User{}
    user.Username="Tom"
    user.Password="123456"
    user.FriendName=[]string{"Li","Fei"}


    //将struct转成json字符串,注意:结构体中的字段首字母必须大写,否则无法解析
    if userJSON,err:=json.Marshal(user);err==nil{
        fmt.Println(string(userJSON))   //打印结果:{"Username":"Tom","Password":"123456","FriendName":["Li","Fei"]}
    }
}

Slice To Json

package main
import (
    "fmt"
    "encoding/json"
)
    
func main() {
    arr:=[]string{"Apple","Orange","Banana"}
    if arrJSON,err:=json.Marshal(arr);err==nil{
        fmt.Println(string(arrJSON))  //打印结果:["Apple","Orange","Banana"]
    }
}

Map To Json

package main
import (
    "fmt"
    "encoding/json"
)
    
func main() {
    m:=map[string]string{"浙江":"杭州","湖南":"长沙"}
    if mJSON,err:=json.Marshal(m);err==nil{
        fmt.Println(string(mJSON))   //打印结果:{"浙江":"杭州","湖南":"长沙"}
    }
}

Json To Struct

不管是属性组成的还是Tag组成的json字符串,都可以正常的解析
tag:
json:"-" // 表示不进行序列化
IsOnSale bool json:"is_on_sale,string"//序列化后转成string
ProductID int64 json:"product_id,omitempty" //为零值时忽略
序列化或者反序列化时可以指定类型,支持string,number和boolean
IsOnSale bool json:"is_on_sale,string"

package main
import (
    "fmt"
    "encoding/json"
)

type User struct {
    //没有后面的tag就会默认为属性名
    Username  string `json:"_"`//如果为下划线就不参与转换
    Password string `json:"password"`
    FriendName []string `json:"friendName"`
}

func main() {
    jsonStr:=`{"Username":"Tom","Password":"123456","FriendName":["Li","Fei"]}`
    var userJSON User
    if err:=json.Unmarshal([]byte(jsonStr),&userJSON);err==nil{
        fmt.Println(userJSON)   //打印结果:{Tom 123456 [Li Fei]}
    }
    jsonStr=`{"password":"123456","friendName":["Li","Fei"]}`
    var userJSON2 User
    if err:=json.Unmarshal([]byte(jsonStr),&userJSON2);err==nil{
        fmt.Println(userJSON2)   //打印结果:{Tom 123456 [Li Fei]}
    }
}

Json To Slice

注意:

    var arr  []string
    arr:=make([]string,0)

正确使用第一个,第二个回报错

package main
import (
    "fmt"
    "encoding/json"
)
    
func main() {
    //json转成slice
    jsonFruit:=`["Apple","Orange","Banana"]`
    var arrFruit  []string
    if err:=json.Unmarshal([]byte(jsonFruit),&arrFruit);err==nil{
        fmt.Println(arrFruit)   //打印结果:[Apple Orange Banana]
    }
}

Json To Map

package main
import (
    "fmt"
    "encoding/json"
)
    
func main() {
    //json转成map
    jsonCity:=`{"浙江":"杭州","湖南":"长沙"}`
    var mapCity map[string]string
    if err:=json.Unmarshal([]byte(jsonCity),&mapCity);err==nil{
        fmt.Println(mapCity)  //打印结果: map[浙江:杭州 湖南:长沙]
    }
}
    原文作者:吃猫的鱼0
    原文地址: https://www.jianshu.com/p/d8f12f457980
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞