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

news/2025/1/16 13:49:32/文章来源:https://www.cnblogs.com/liy36/p/18674831
package mainimport ("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 stringswitch s.Gender {case 0:genderStr = "woman"case 1:genderStr = "man"default:genderStr = "unknown"}type Alias Structsreturn json.Marshal(&struct {AliasGender string `json:"gender"`}{Alias:  Alias(s),Gender: genderStr,})
}// UnmarshalJSON 重写反序列化方法,如果gender是man,则改为1,如果为woman改为0
func (s *Structs) UnmarshalJSON(data []byte) error {type Alias Structsaux := 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 = 0case "man":s.Gender = 1default: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 Structsif 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()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870101.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】若依(ruoyi-cloud)——14.Sentinel支持(服务熔断与降级)

若依微服务版(ruoyi-Cloud)如何实现熔断和降级? 知识前提:对Sentinel的使用有了解 若依微服务版启动 对nacos服务注册和使用有了解若依微服务版(ruoyi-cloud)中使用sentinel,进行服务熔断与降级。 环境要求和前提 JDK >= 1.8 (推荐1.8版本) Mysql >= 5.7.0 (推荐5.7…

Hutool 实现非对称加密(RSA)

目录思路生成RAS密钥消息公钥加密、私钥解密代码Demo生成 A 的密钥生成 B 的密钥A 发送消息给 BB 解密 A 消息对称加密中,我们只需要一个密钥,通信双方同时持有。而非对称加密需要4个密钥。通信双方各自准备一对公钥和私钥。其中公钥是公开的,由信息接受方提供给信息发送方。…

【Node.js渗透】提取和分析 .asar 文件

#Electron 免责声明 ⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!书接上回以及上上回,在了解了操作系统上基于 Electron 的应用程序的安装和识别过程后,我们将探讨提取…

大模型微调基本概念指北

本文主要分享一下大模型微调相关的基本概念,包括大模型(GPT)训练流程、微调(SFT)方法&分类&框架&最佳实践、强化学习(RLHF),最后则是分享了如何训练垂直领域大模型。本文是参考网上博客、文章后进行总结而成,旨在让刚接触大模型的同学阅读后能对大模型训练的各个…

看了一个关于linux platform的好视频

视频地址: 《嵌入式Linux platform总线驱动与设备匹配的三种方式》 https://www.bilibili.com/video/BV134CFYqEki?buvid=YC4D5AC32B076A51424FACFDDBD3BD15822A&from_spmid=tm.recommend.0.0&is_story_h5=false&mid=PbeiH8sfJs5bwGp1257AQw%3D%3D&plat_id=1…

学习 - 人工智能- 大模型的演变和训练

大模型的演变和训练 大模型训练整体上分为三个阶段: 预训练、 SFT(监督微调)以及RLHF(基于人类反馈的强化学习)一、预训练 预训练的过程类似从婴儿成长成中学生的阶段,在这个阶段我们会学习各种各样的知识,我们的语言习惯、知识体系等重要部分都会形成;对于大模型来讲,在这…

RFID基础——概念与分类

RFID 的全称是射频识别技术(Radio Frequency Identification)。是一项利用射频信号通过空间耦合(交变磁场或电磁场)实现无接触信息传递并通过所传递的信息达到识别目的的技术。这项技术在日常生活中应用广泛,例如我国的第二代身份证、门禁卡、图书标签。 RFID与NFC的区别 …

(未完工)「学习笔记」二维数点问题

0.0 前言 看了一个晚上,加上同桌的讲解,大致了解了二维数点问题的基本思路。 0.1 前置知识可持久化线段树树状数组1.0 概述 二维数点问题的一般形式是形如“给定平面上 \(n\) 个点,每次询问给定一个矩形,求该位于矩形内的点的个数”一类问题,模板题为 P2163 [SHOI2007] 园…

CentOS扩容boot分区并升级内核

本文作者CVE-柠檬i:https://www.cnblogs.com/CVE-Lemon 前言 由于安装k8s需要升级内核,但我自己的的boot分区只有200M大小,无法安装新内核,所以干脆把swap分区分给boot了。在此期间关于grub的操作踩了好多坑,所以特此记录一下正确操作。 使用rpm安装新内核,下载链接:htt…

陨石的秘密

题目链接: https://www.acwing.com/problem/content/319/ 题目描述提取题目大意: 构造 L1对{},L2对[],L3对() 组成的深度为D的括号序列,求方案数。 并且中括号里不能有大括号,小括号里不能有中括号和大括号。 思路:考虑“第一段”括号序列(它作为一个整体,只能是{} []…

Xorto

给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为0。暴力,每次找一个中点,找左右两边异或值一样的区间 #include<bits/stdc++.h> #define int long long #define TEST #define TESTS int _; cin >> _; while(_--) using…