首页 > 其他分享 >go json

go json

时间:2023-01-18 23:34:44浏览次数:39  
标签:vc string fmt Belgium json Address go

转化为json格式

func Marshal(v interface{}) ([]byte, error)  //将v(一般为结构体)转化为json格式
// json.go
package main

import (
    "encoding/json"
    "fmt"
    "log"
    "os"
)

type Address struct {
    Type    string
    City    string
    Country string
}

type VCard struct {
    FirstName string
    LastName  string
    Addresses []*Address
    Remark    string
}

func main() {
    pa := &Address{"private", "Aartselaar", "Belgium"}
    wa := &Address{"work", "Boom", "Belgium"}
    vc := VCard{"Jan", "Kersschot", []*Address{pa, wa}, "none"}
    // fmt.Printf("%v: \n", vc) // {Jan Kersschot [0x126d2b80 0x126d2be0] none}:
    // JSON format:
    js, _ := json.Marshal(vc)
    fmt.Printf("JSON format: %s", js)
}
结果:

{"FirstName":"Jan","LastName":"Kersschot","Addresses":[{"Type":"private","City":
"Aartselaar","Country":"Belgium"},{"Type":"work","City":"Boom","Country":"Belgiu
m"}],"Remark":"none"}

 
func MarshalIndent(v any, prefix string, indent string) ([]byte, error)

Code:
data := map[string]int{ "a": 1, "b": 2, } b, err := json.MarshalIndent(data, "<prefix>", "<indent>") if err != nil { log.Fatal(err) } fmt.Println(string(b))
Output:
{
<prefix><indent>"a": 1,
<prefix><indent>"b": 2
<prefix>}

func main() {
    pa := &Address{"private", "Aartselaar", "Belgium"}
    wa := &Address{"work", "Boom", "Belgium"}
    vc := VCard{"Jan", "Kersschot", []*Address{pa, wa}, "none"}
    // fmt.Printf("%v: \n", vc) // {Jan Kersschot [0x126d2b80 0x126d2be0] none}:
    // JSON format:
    js, _ := json.MarshalIndent(vc, " ", " ")
    fmt.Printf("JSON format: %s", js)
}
结果:

{
  "FirstName": "Jan",
  "LastName": "Kersschot",
  "Addresses": [
  {
  "Type": "private",
  "City": "Aartselaar",
  "Country": "Belgium"
  },
  {
  "Type": "work",
  "City": "Boom",
  "Country": "Belgium"
  }
  ],
  "Remark": "none"
}

 

反序列化

func Unmarshal(data []byte, v interface{})    //error 把 JSON 解码为数据结构。
func main() {
    pa := &Address{"private", "Aartselaar", "Belgium"}
    wa := &Address{"work", "Boom", "Belgium"}
    vc := VCard{"Jan", "Kersschot", []*Address{pa, wa}, "none"}

    js, _ := json.MarshalIndent(vc, " ", " ")
    fmt.Printf("%s\n", js)
    var _vc VCard
    json.Unmarshal(js, &_vc)
    fmt.Println(_vc.FirstName, _vc.LastName, _vc.Addresses[0], _vc.Addresses[1], _vc.Remark)
}
结果:

{
"FirstName": "Jan",
"LastName": "Kersschot",
"Addresses": [
{
"Type": "private",
"City": "Aartselaar",
"Country": "Belgium"
},
{
"Type": "work",
"City": "Boom",
"Country": "Belgium"
}
],
"Remark": "none"
}
Jan Kersschot &{private Aartselaar Belgium} &{work Boom Belgium} none

 

解码任意的数据:

json 包使用 map[string]interface{} 和 []interface{} 储存任意的 JSON 对象和数组;其可以被反序列化为任何的 JSON blob 存储到接口值中。

例子:

b := []byte(`{"Name": "Wednesday", "Age": 6, "Parents": ["Gomez", "Morticia"]}`)
var f interface{}
err := json.Unmarshal(b, &f)
//f指向的是一个mpakey 是一个字符串,value 是自身存储作为空接口类型的值:

map[string]interface{} {
  "Name": "Wednesday",
  "Age": 6,
  "Parents": []interface{} {
  "Gomez",
  "Morticia",
  },
}

使用类型断言:

m := f.(map[string]interface{})

可以通过 for range 语法和 type switch 来访问其实际类型:

for k, v := range m {
  switch vv := v.(type) {
  case string:
    fmt.Println(k, "is string", vv)
  case int:
    fmt.Println(k, "is int", vv)

  case []interface{}:
    fmt.Println(k, "is an array:")
    for i, u := range vv {
    fmt.Println(i, u)
    }
  default:
    fmt.Println(k, "is of a type I don’t know how to handle")
    }
}

解码数据到结构

如果我们事先知道 JSON 数据,我们可以定义一个适当的结构并对 JSON 数据反序列化:

type FamilyMember struct {
    Name    string
    Age     int
    Parents []string
}

var m FamilyMember
err := json.Unmarshal(b, &m)

编码和解码流

json 包提供 Decoder 和 Encoder 类型来支持常用 JSON 数据流读写。NewDecoder() 和 NewEncoder() 函数分别封装了 io.Reader 和 io.Writer 接口。

func NewDecoder(r io.Reader) *Decoder
func NewEncoder(w io.Writer) *Encoder

要想把 JSON 直接写入文件,可以使用 json.NewEncoder 初始化文件(或者任何实现 io.Writer 的类型),并调用 Encode();反过来与其对应的是使用 json.NewDecoder 和 Decode() 函数:

func NewDecoder(r io.Reader) *Decoder
func (dec *Decoder) Decode(v interface{}) error
func main() {
    pa := &Address{"private", "Aartselaar", "Belgium"}
    wa := &Address{"work", "Boom", "Belgium"}
    vc := VCard{"Jan", "Kersschot", []*Address{pa, wa}, "none"}

    j, _ := os.OpenFile("json.txt", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666)
    j_encoder := json.NewEncoder(j)
    j_encoder.Encode(vc)
    defer j.Close()
}
func main() {
    var vc VCard
    j, _ := os.Open("./json.txt")
    defer j.Close()
    j_Decoder := json.NewDecoder(j)
    j_Decoder.Decode(&vc)

    fmt.Println(vc.FirstName, vc.LastName, vc.Addresses[0], vc.Addresses[1], vc.Remark)
}

 

标签:vc,string,fmt,Belgium,json,Address,go
From: https://www.cnblogs.com/dadishi/p/17060851.html

相关文章

  • Algorithm 4 - 字符串 (Seriously)
    主讲一些自动机相关、高级技巧相关。Part1AC自动机是最好理解的一个自动机捏。Part1.1性质与探索方向AC自动机本身基于Trie,即去掉后面说的fail指针,它就是一棵......
  • 坑!你不知道的JSON解析
    背景最近在对接国内的外卖平台,代码啥的正常开发、测试、上线都没发现什么异常的。突然,最近有运维反馈说漏了单据,一开始我以为是外卖平台那边接口异常,拉单延迟导致的,就没怎......
  • go 接口
    接口的值接口的值简单来说,是由两部分组成的,就是类型和数据。那么判断两个接口是相等,就是看他们的这两部分是否相等;另外类型和数据都为nil才代表接口是nil,这里就解释了上......
  • Django一个“高质量”小白的学习之路(给自己看)
     第一天day1:人类的思维倾向于直白、视觉和线性,还有好奇心,这是祖先遗传下来的思维习惯。如果论结果,显然我是一个计算机学习的失败者。因为我作为一个已经刚到不惑之年......
  • hugo 使用
    同步使用rsync来进行同步,linux系统中rsync速度快于rclone。rclone只是多提供了云服务商。服务端安装rsyncsudoyuminstall-yrsync服务端配置vim/etc/rs......
  • JSON传递bool类型数据的处理方式
    ajax中使用json传递数据时,其它数据类型都不是问题,但是如果服务器端生成的JSON中有bool类型的数据时,到客户端解析时出现了小小的问题,总结如下:服务器返回的JSON为:{"TypeID":[......
  • 利用数组特性便利json对象中属性
    在使用ajax编程时,有时候服务器端返回的json的属性是不确定的,这样在客户端使用时,就没有办法使用json对象的属性名称来访问属性值。 我们可以将json对象看作是一个字典数组,具......
  • MeterSphere 接口自动化 CSV 整合 JSON 文件
    在 ToB系统的业务场景中,经常有厂家需要将原始JSON数据,用于请求体传参,或者响应体对比等业务场景。对应Metersphere中接口自动化,CSV数据驱动数据包含JSON结构内容,用......
  • GO语言实现一个简单的命令行词典
    一个命令行词典,使用浏览器中的开发者工具进行抓包。拿到接口后再在IDE中进行实现。抓包打开检查后找到dict查看状态代码是否为POST,复制dict选择复制为cURL(bash)拿到接......
  • 13.进一步认识Cargo及crates.io
    一、使用发布配置来定制构建Rust中的发布配置是一系列预定义好的配置方案,它们的配置选项各有不同,都允许程序员对细节进行定制修改。Cargo最常用的配置有两种:执行cargob......