首页 > 其他分享 >Go 重写JSON序列化和反序列化方法

Go 重写JSON序列化和反序列化方法

时间:2025-01-16 13:56:49浏览次数:1  
标签:err Gender json gg JSON gender Go 序列化 Structs

package main

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

type Structs struct {
	Name   string `json:"name"`
	Gender int    `json:"gender"`
}

// MarshalJSON 重写序列化方法,如果gender是0则改为woman,如果是1则改为man
func (s Structs) MarshalJSON() ([]byte, error) {
	var genderStr string
	switch s.Gender {
	case 0:
		genderStr = "woman"
	case 1:
		genderStr = "man"
	default:
		genderStr = "unknown"
	}

	type Alias Structs

	return json.Marshal(&struct {
		Alias
		Gender string `json:"gender"`
	}{
		Alias:  Alias(s),
		Gender: genderStr,
	})
}

// UnmarshalJSON 重写反序列化方法,如果gender是man,则改为1,如果为woman改为0
func (s *Structs) UnmarshalJSON(data []byte) error {
	type Alias Structs

	aux := struct {
		Gender string `json:"gender"`
		*Alias
	}{
		Alias: (*Alias)(s),
	}

	if err := json.Unmarshal(data, &aux); err != nil {
		return err
	}

	switch strings.ToLower(aux.Gender) {
	case "woman":
		s.Gender = 0
	case "man":
		s.Gender = 1
	default:
		return fmt.Errorf("invalid gender value: %s", aux.Gender)
	}

	return nil
}

func marshalJSON() {
	gg := Structs{
		Name:   "gg",
		Gender: 1,
	}

	mm := Structs{
		Name:   "mm",
		Gender: 0,
	}

	ggdata, err := json.Marshal(gg)
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Printf("ggdata: %v\n", string(ggdata))

	mmdata, err := json.Marshal(mm)
	if err != nil {
		log.Fatalln(err)
	}

	fmt.Printf("mmdata: %v\n", string(mmdata))

	// Output:
	// ggdata: {"name":"gg","gender":"man"}
	// mmdata: {"name":"mm","gender":"woman"}
}

func unmarshalJSON() {
	ggdata := `{"name":"gg","gender":"man"}`
	var gg Structs
	if err := json.Unmarshal([]byte(ggdata), &gg); err != nil {
		log.Fatalln(err)
	}

	fmt.Printf("%#v\n", gg)
	mmdata := `{"name":"mm","gender":"woman"}`
	var mm = Structs{}
	if err := json.Unmarshal([]byte(mmdata), &mm); err != nil {
		log.Fatalln(err)
	}
	fmt.Printf("%#v\n", mm)

	// Output:
	// main_test.Structs{Name:"gg", Gender:1}
	// main_test.Structs{Name:"mm", Gender:0}
}

func main() {
	marshalJSON()

	fmt.Println(strings.Repeat("=", 30))

	unmarshalJSON()
}



标签:err,Gender,json,gg,JSON,gender,Go,序列化,Structs
From: https://www.cnblogs.com/liy36/p/18674831

相关文章

  • 把MongoDB数据库里某字段的内容上传到tos,并把原内容替换成tos链接
    importloggingfromioimportBytesIOimporttosfromurllib.parseimportquote_plusimportpymongo#设置日志格式logging.basicConfig(level=logging.INFO,format='%(asctime)s-%(levelname)s-%(message)s')#MongoDB连接配置#mongo_uri="mongodb......
  • Go语言的数据竞争 (Data Race) 和 竞态条件 (Race Condition)
    文章精选推荐1JetBrainsAiassistant编程工具让你的工作效率翻倍2ExtraIcons:JetBrainsIDE的图标增强神器3IDEA插件推荐-SequenceDiagram,自动生成时序图4BashSupportPro这个ides插件主要是用来干嘛的?5IDEA必装的插件:SpringBootHelper的使用与功能特点6A......
  • Golang学习笔记_24——泛型
    Golang学习笔记_21——ReaderGolang学习笔记_22——Reader示例Golang学习笔记_23——error补充文章目录泛型1.泛型中的类型参数1.1类型参数声明1.2类型参数的约束1.3类型参数的实例化2.泛型函数3.泛型类型4.泛型接口源码泛型Go语言从1.18版本开始引入......
  • java 反序列化 cc11 复现
    cc11就是对我们调试过的cc3中出口为LazyMap并且没有绕过InvokerTransformer的版本进行修改,使其不出现非javase中的数组.换句话说就是绕过了ChainedTransformer直接来看exppackageorg.example;importcom.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;importco......
  • java 反序列化 URLDNS 链
    常用于探测反序列化漏洞是否存在的一条链,之前调过cc6,这条应该比较简单,自己随便调调就行.URL直接来看hashCode方法publicsynchronizedinthashCode(){if(hashCode!=-1)returnhashCode;hashCode=handler.hashCode(this);re......
  • 判断字符串是否为json字符串方法
    要验证一个字符串是否为有效的JSON格式,可以使用JavaScript的JSON.parse()方法,并结合try...catch语句来捕获解析过程中可能出现的异常。以下是一个示例函数:functionisJSON(str){if(typeofstr==='string'){try{constobj=JSON.par......
  • Google开发者账号注册步骤详解
    注册Google开发者账号的步骤如下:访问GoogleDevelopers网站:打开浏览器,访问GoogleDevelopers网站。登录Google账号:如果你已经有Google账号(如Gmail账号),点击页面右上角的“登录”按钮,使用你的Google账号登录。如果你没有Google账号,点击“创建账号”......
  • vscode调试中launch.json文件配置
    {  //使用IntelliSense了解相关属性。  //悬停以查看现有属性的描述。  //欲了解更多信息,请访问:https://go.microsoft.com/fwlink/?linkid=830387  "version":"0.2.0",  "configurations":[    {      "name":"(gdb)......
  • Google Fonts字体库使用指南
    GoogleFonts是一个免费的在线字体库,提供了超过1000种字体样式,用户可以轻松地将这些字体添加到他们的网页中。以下是对GoogleFonts的介绍以及使用说明:介绍多样性:GoogleFonts提供了广泛的字体选项,包括从经典的无衬线字体到优雅的衬线字体,以及各种手写和装饰性字体。易......
  • TangGo:国产化综合红队协同工具
    免责声明请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与本公众号无关。最近我们团队在进行hvv演练的时候,我真切体会到了在日常工作中对高效工具的需求,找到一款合适的测试平台简直是事半功倍。后面用了TangGo测试平台。这款工具真是让我省心不少。之前听说......