首页 > 其他分享 >golang标准库 json

golang标准库 json

时间:2023-03-05 09:23:32浏览次数:48  
标签:序列化 err fmt 34 golang 标准 json 101

序列化:将内存中对象存储下来,把它变成一个个字节,转为二进制数据

反序列化:将文件的一个个字节恢复成内存中队形。从二进制数据中恢复

字符序列化:json xml

二进制序列化: protocol buffers 、messagepak等

 

package main

import (
	"encoding/json"
	"fmt"
	"github.com/vmihailenco/msgpack/v5"
)

type Persion struct {
	Name string `json:"nnn" msgpack:"name"` //标签 json使用nnn mespack使用name
	Age  int    `json:"age"`
}

func example1() {
	//序列化 go数据--->json协议--->字符串
	//json本质上是字符串 int 100 =>json 是string 100 这是三个字符 \x31 \x30 \x30(16进制字符表达) x30(16进制整数表达法)
	var data = []any{
		100, 2.5, true, false, nil, "abc",
		[...]int{97, 98, 99},
		map[string]int{"aaaa": 1111, "bbbb": 2222}, //json要求key必须是字符串
	}
	var target = make([][]byte, 0, len(data)) //b的类型是[]byte,放所有的b,定义成[][]byte
	for i, v := range data {
		b, err := json.Marshal(v)
		if err != nil {
			continue
		}
		target = append(target, b)
		//0: int 100,[]uint8 [49 48 48] 100
		fmt.Printf("%d: %T %[2]v,%T %[3]v %s\n", i, v, b, string(b))
	}
	fmt.Println(json.Marshal(data)) // 字符串 91 49 48 48 44 50 46 53 44 116 114 117 101 44 102 97 108 115 101 44 110 117 108 108 44 34 97 98 99 34 93
	fmt.Println(target)             //切片[[49 48 48] [50 46 53] [116 114 117 101] [102 97 108 115 101] [110 117 108 108] [34 97 98 99 34]]

	//反序列化
	println("=====反序列化======")
	for j, v := range target {
		var i any
		err := json.Unmarshal(v, &i) //传指针 不然外面的i无法修改
		if err != nil {
			continue
		}
		//0:[]uint8 [49 48 48], float64 100  此时还原回去 但100的类型变了
		//map[string]interface {} map[aaaa:1111 bbbb:2222]
		fmt.Printf("%d:%T %[2]v, %T %[3]v\n", j, v, i)
	}

}
func example2() {
	var data = Persion{
		Name: "Tome",
		Age:  18,
	}
	b, err := json.Marshal(data)
	if err != nil {
		panic(err)
	}
	//main.Persion {Name:Tome Age:18}; []uint8 [123 34 110 110 110 34 58 34 84 111 109 101 34 44 34 97 103 101 34 58 49 56 125]
	fmt.Printf("%T %+[1]v; %T %[2]v\n", data, b)
	fmt.Println(string(b)) //{"Name":"Tome","Age":18} Persion类型没了
	//知道实例类型的时候
	var p1 Persion
	err = json.Unmarshal(b, &p1)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%T %+[1]v\n", p1) //main.Persion {Name:Tome Age:18}
	//不知道实例类型的时候
	var i interface{}
	err = json.Unmarshal(b, &i)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%T %+[1]v\n", i) //map[string]interface {} map[Age:18 Name:Tome]

	//msgpack
	fmt.Println("========msgpack=========")
	b, err = msgpack.Marshal(data) //返回的是二进制的[]byte json返回的是字符的[]byte编码
	if err != nil {
		panic(err)
	}
	fmt.Printf("%T, %+[1]v\n", b) //[]uint8, [130 164 110 97 109 101 164 84 111 109 101 163 65 103 101 18]
	//反序列化
	//知道目标类型
	var j Persion
	err = msgpack.Unmarshal(b, &j)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("%T %+[1]v\n", j) //main.Persion {Name:Tome Age:18}
}

func main() {
	//example1()
	example2()
}

  

标签:序列化,err,fmt,34,golang,标准,json,101
From: https://www.cnblogs.com/dribs/p/17175077.html

相关文章

  • Golang HTTP编程及源码解析-请求/响应处理
    1.HTTP协议HTTP协议是HyperTextTransferProtocol(超文本传输协议)的缩写,基于TCP/IP通信协议来传递数据(HTML文件、图片文件、查询结果等)。HTTP是无连接的:无连接的......
  • Java-类-对象 - 对象内存图 成员变量和局部变量的不同 this关键字 构造方法 封装
         packagecom.demo.css;publicclasscss01{//java要创造对象,必须要有类的存在//类:一组相关属性和行为的集合,看做是对象的设计图//对象......
  • 萌新也能看懂的 Golang 题解(一)
    写在前面关于“模拟题”和“算法题”及主观难度评价第一批1791.设备编号(模拟)1792.服务器集群网络延时(排序、数学)1793.给定差值的组合(哈希表)1787.最长元音子串(模......
  • 萌新也能看懂的 Golang 题解(二)
    第二批1807.矩阵转置(数学)难度:简单;主观评价:简单。简单模拟题+数学题(判断完全平方数)。先判断矩阵长度是否为完全平方数(开根号然后自身相乘,判断和开根号之前的数是否一致......
  • 萌新也能看懂的 Golang 题解(三)
    第三批1822.电话拦截(模拟、排序)难度:中等;主观评价:简单。sort.Slice() 应用题,重点在于通配符的判断和如何设计数据结构保证最后能按呼叫顺序返回通话记录。对于没有通......
  • golang的指针变量,智商声明没有赋值,不能直接 *p=123之类的
    packagemainimport"fmt"funcmain(){ //申明指针的时候,如果没有指向某个变量,默认值为nil //不能直接进行操作,包括读写 //而用new返回的是有默认值的指针,为数据......
  • 高性能 Jsonpath 框架,Snack3 3.2.57 发布
    Snack3,一个高性能的JsonPath框架借鉴了Javascript所有变量由var申明,及Xmldom一切都是Node的设计。其下一切数据都以ONode表示,ONode也即Onenode之意,代表任何......
  • FastJson JdbcRowSetImpl
    Java安全之FastJsonJdbcRowSetImpl链分析利用限制RMI利用的JDK版本≤JDK6u132、7u122、8u113LADP利用JDK版本≤6u211、7u201、8u191因为主要是FastJson,所以就不......
  • ES6标准的JS代码,是否能进码混淆加密?
    nodejs开发,使用es6标准的javascript代码,是否能进行代码混淆加密?回答是肯定的,能。使用JShaman就可以进行加密。以import语法为例,用一个node小工程进行测试:先准备两段代码,一个......
  • protobuf golang&&python序列化反序列化测试
    1.概要最近考虑采用protobuf来实现kafka消息传递,所以先测试一下golang和python之前序列化互通问题。由于go和python对于二进制的表示在ide层面是无法统一的,直接把python......