Golang encodingJSON与结构体结合使用实践

Go中通过encoding/json包与结构体标签实现JSON编解码,利用json:”name”指定字段名,omitempty省略空值,”-“忽略字段,结合map[string]interface{}处理动态字段,嵌套结构体和切片应对复杂结构,实现Marshaler/Unmarshaler接口自定义时间等类型序列化,需注意导出字段首字母大写及空值判断规则。

golang encodingjson与结构体结合使用实践

在 Go 语言开发中,encoding/json 包与结构体的结合使用是处理 JSON 数据的核心方式。无论是解析 HTTP 请求中的 JSON 数据,还是将程序数据序列化为 JSON 响应,都离不开结构体与 json 标签的合理设计。

结构体字段与 JSON 映射

Go 中通过结构体字段的标签(tag)控制 JSON 的序列化和反序列化行为。最常见的用法是 json: 标签,用于指定字段在 JSON 中的名称。

例如:

type User struct {    ID    int    `json:"id"`    Name  string `json:"name"`    Email string `json:"email,omitempty"`    Age   int    `json:"-"`}

说明:

立即学习“go语言免费学习笔记(深入)”;

json:”id”:序列化和反序列化时,该字段对应 JSON 中的 “id” 字段。 omitempty:如果字段值为空(如零值、nil、空字符串等),序列化时会省略该字段。 json:”-“:明确忽略该字段,不参与序列化或反序列化。

处理动态或未知字段

有时我们无法提前定义所有字段,比如接收第三方 API 的部分未知结构。此时可结合 map[string]interface{} 或嵌套结构体灵活处理。

示例:

type Response struct {    Status string                 `json:"status"`    Data   map[string]interface{} `json:"data"`}

使用 json.Unmarshal 可将任意 JSON 对象解析到 map 中,之后按需访问字段。注意类型断言的使用:

if name, ok := data["name"].(string); ok {    fmt.Println("Name:", name)}

嵌套结构与切片处理

实际应用中,JSON 往往包含数组或嵌套对象。Go 结构体可通过嵌套结构体或切片自然表达。

例如:

type Address struct {    City  string `json:"city"`    Zip   string `json:"zip"`}type User struct {    Name    string    `json:"name"`    Emails  []string  `json:"emails"`    Address Address   `json:"address"`}

上述结构能正确解析如下 JSON:

{  "name": "Alice",  "emails": ["a@example.com", "b@example.net"],  "address": {    "city": "Beijing",    "zip": "100000"  }}

自定义序列化行为

对于特殊类型(如时间格式、枚举值),可实现 json.MarshalerUnmarshaler 接口来自定义编解码逻辑。

常见例子是格式化时间:

type CustomTime struct {    time.Time}func (ct *CustomTime) MarshalJSON() ([]byte, error) {    return []byte(fmt.Sprintf(`"%s"`, ct.Time.Format("2006-01-02"))), nil}func (ct *CustomTime) UnmarshalJSON(data []byte) error {    loc, _ := time.LoadLocation("Asia/Shanghai")    t, err := time.ParseInLocation(`"2006-01-02"`, string(data), loc)    if err != nil {        return err    }    ct.Time = t    return nil}

然后在结构体中使用:

type Event struct {    Title string      `json:"title"`    Date  CustomTime  `json:"date"`}

基本上就这些。合理利用结构体标签、嵌套结构和接口实现,能让 Go 程序轻松应对各种 JSON 场景。关键是结构清晰、标签准确,避免过度依赖泛型 map。不复杂但容易忽略细节,比如大小写导出和 omitempty 的触发条件。

以上就是Golang encodingJSON与结构体结合使用实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1412837.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月16日 06:41:22
下一篇 2025年12月16日 06:41:30

相关推荐

  • C#基础之操作优化实例教程

    对数据的查询,删除等基本操作是任何编程语言都会涉及到的基础,因此,研究了一下c#中比较常用的数据操作类型,并顺手做个笔记. List查询时,若是处理比较大的数据则使用HashSet类,因为List是基于线性表操作的.但其内嵌了二分查找(BinarySearch),因此,也可以在存储完之后进行排序,随…

    2025年12月17日
    000
  • 分享一个IoC入门教程实例

    spring.net包括控制反转(ioc) 和面向切面(aop),这篇文章主要说下ioc方面的入门。 一、首先建立一个MVC项目名称叫SpringDemo,然后用NuGet下载spring(我用的是Spring.Net NHibernate 4 support) 二、类设计,在Models文件夹下面…

    2025年12月17日
    000
  • C#串口通信的实例教程

    因为参加一个小项目,需要对继电器进行串口控制,所以这两天学习了基本的串口编程。同事那边有java的串口通信包,不过是从网上下载的,比较零乱,难以准确掌握串口通信的流程和内含。因此,个人通过学习网上大牛的方法,利用c#实现了基本的串口通信编程。下面对学习成果进行总结归纳,希望对大家有所帮助。 一、串口…

    2025年12月17日
    000
  • C#中多线程之Thread类详解

    使用system.threading.thread类可以创建和控制线程。 常用的构造函数有: // 摘要: // 初始化 System.Threading.Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托。//// 参数: // start:// System.Threading.…

    2025年12月17日
    000
  • 总结.NET平台上一些常用的框架

    分布式缓存框架: Microsoft Velocity:微软自家分布式缓存服务框架。 Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度。 Redis:是一个高性能的KV数据库。 它的出现很大程度补偿了Memcached在某些方面的不足。 EnyimMemcached…

    2025年12月17日
    000
  • C#中五种访问修饰符作用范围实例详解

    在c#语言中,共有五种访问修饰符:public、private、protected、internal、protected internal。作用范围如下表:访问修饰符 说明public 公有访问。不受任何限制。private 私有访问。只限于本类成员访问,子类,实例都不能访问。protected 保…

    好文分享 2025年12月17日
    000
  • C#中foreach实例代码

    foreach可以遍历一些数据类型。由图可知,被遍历的数据类型必须拥有getenumerator的公共方法。 在使用foreach遍历时涉及到var推断类型,这时如何不是实现泛型版本,则一律是object类型。 foreach遍历只能读取数据,不能修改数据,可以通过string检测,string是可…

    2025年12月17日 好文分享
    000
  • 关于.net C# Sql数据库SQLHelper类实例代码

    using system;using system.collections.generic;using system.text;using system.collections;using system.data.sqlclient;using system.data;using system.co…

    好文分享 2025年12月17日
    000
  • C#线程控制的实例详解

    方案一:    调用线程控制方法.启动:Thread.Start();停止:Thread.Abort();暂停:Thread.Suspend();继续:Thread.Resume();   private void btn_Start_Click(object sender, EventArgs e…

    2025年12月17日
    000
  • 编写高性能 .NET的实例教程

    减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少gc回收时的压力,同时降低了内存碎片与cpu的使用量。你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突。 你需要在设计对象时仔细检查每个它并问自己: 我真的需要这个对象吗? 这个字段是我需要的吗? 我能减少数组的尺寸吗? 我能缩小…

    好文分享 2025年12月17日
    000
  • 泛型的概述和具体使用

    一、泛型概述       泛型类和泛型方法兼复用性、类型安全和高效率于一身,是与之对应的非泛型的类和方法所不及。泛型广泛用于容器(collections)和对容器操作的方法中。.net framework 2.0的类库提供一个新的命名空间system.collections.generic,其中包含…

    好文分享 2025年12月17日
    000
  • 关于json result的实例代码

    public jsonresult jsondata()        {            httpcontext.response.appendheader(“access-control-allow-origin”, “*”);       …

    好文分享 2025年12月17日
    000
  • 使用 VSCode 编写 .NET Core 项目的实例教程

    windows 开发环境搭建: 1.安装最新 VSCode,; 2.安装最新 .NET CORE,; 3. 在 VS Code 中获取 C# extension ;   一、创建C#项目 1.打开VS Code,从命令行打开预先定义的文件夹,如: E:NetCoredemo; 使用快键键调出命令行窗…

    2025年12月17日 好文分享
    000
  • Core实现全面扫盲贴的ASP方法详解

    本篇文章主要介绍了.net core,.net core是一个开源通用的开发框架,支持跨平台,即支持在window,macos,linux等系统上的开发和部署有兴趣的可以了解一下。 1. 前言 .NET发行至今已经过了十四个年头。随着版本的不断迭代更新,.NET在Windows平台上的表现也是越来越…

    2025年12月17日 好文分享
    000
  • .Net 垃圾回收机制原理(二)

    英文原文:Jeffrey Richter 编译:赵玉开 链接http://www.php.cn/ 上一篇文章介绍了.Net 垃圾回收的基本原理和垃圾回收执行Finalize方法的内部机制;这一篇我们看下弱引用对象,代,多线程垃圾回收,大对象处理以及和垃圾回收相关的性能计数器。让我们从弱引用对象说起,…

    2025年12月17日 好文分享
    000
  • .Net 垃圾回收机制原理(一)

    英文原文:Jeffrey Richter 编译:赵玉开 链接:http://www.php.cn/ 有了Microsoft.Net clr中的垃圾回收机制程序员不需要再关注什么时候释放内存,释放内存这件事儿完全由GC做了,对程序员来说是透明的。尽管如此,作为一个.Net程序员很有必要理解垃圾回收是如…

    2025年12月17日 好文分享
    000
  • .NET中异常处理的最佳实践(译)

    原文地址:点击打开链接 本文翻译自CodeProject上的一篇文章,原文地址。 目录 介绍 做最坏的打算 提前检查 不要信任外部数据 可信任的设备:摄像头、鼠标以及键盘  “写操作”同样可能失效 安全编程 不要抛出“new Exception()” 不要将重要的异常信息存储在Message属性中 …

    2025年12月17日
    000
  • C# 将 Json 解析成 DateTable

    c# 将 json 解析成 datetable  #region 将 Json 解析成 DateTable /// /// 将 Json 解析成 DateTable。 /// Json 数据格式如: /// {table:[{column1:1,column2:2,column3:3},{colum…

    2025年12月17日
    000
  • C# Json 序列化与反序列化一

    public class JsonSerializer { /// /// json序列化 /// /// /// /// public static string JsonStringSerializer(T t) { DataContractJsonSerializer ser = new Da…

    好文分享 2025年12月17日
    000
  • .NET中的六个重要概念:栈、堆、值类型、引用类型、装箱和拆箱

    内容导读 •概述 •当你声明一个变量背后发生了什么?•堆和栈•值类型和引用类型•哪些是值类型,哪些是引用类型?•装箱和拆箱•装箱和拆箱的性能问题一、概述本文会阐述六个重要的概念:堆、栈、值类型、引用类型、装箱和拆箱。本文首先会通过阐述当你定义一个变量之后系统内部发生的改变开始讲解,然后将关注点转移到…

    2025年12月17日 好文分享
    000

发表回复

登录后才能评论
关注微信