首页 > 其他分享 >Golang 序列化与反序列化,包含字段首字母小写和字段时间格式化

Golang 序列化与反序列化,包含字段首字母小写和字段时间格式化

时间:2024-05-25 18:45:02浏览次数:21  
标签:string err fmt Golang 首字母 json time 序列化

 

golang 结构体 json 的时间  序列化与反序列化  格式化解决方案  // 最近开发项目时候发现一个结构体的 Json 转换的时间格式问题。 // 即这种 1993-01-01T20:08:23.000000028+08:00 这种表示 UTC 方法。 // 从我们习惯来说,更喜欢希望的是 1993-01-01 20:08:23 这种格式 如何处理:

通过 time.Time 类型别名

import (
    "fmt"
    "time"
)

type JsonTime time.Time
// 最近开发项目时候发现一个结构体的 Json 转换的时间格式问题。 
// 即这种 1993-01-01T20:08:23.000000028+08:00 这种表示 UTC 方法。
// 从我们习惯来说,更喜欢希望的是 1993-01-01 20:08:23 这种格式
// 实现它的json序列化方法
func (jsonTime *JsonTime) MarshalJSON() ([]byte, error) {
    var stamp = fmt.Sprintf("\"%s\"", time.Time(*jsonTime).Format("2006-01-02 15:04:05"))
    return []byte(stamp), nil
}

// golang默认time.Time 类型默认解析的日期格式是 RFC3339 标准,
// 也就是 2006-01-02T15:04:05Z07:00 的格式,所以前端传入的json字符串中时间格
// 式为 yyyy-MM-dd HH:mm:ss时候,解析为time.Time格式会报错
// 解决方案:利用time.Time别名类型实现UnmarshalJSON 方法,既可以解析成功

// 实现它的json反序列化方法
// 自定义json反序列化  golang 结构体 json 的时间格式化解决方案
func (jsonTime *JsonTime) UnmarshalJSON(data []byte) error {
    t, err := time.Parse(`"2006-01-02 15:04:05"`, string(data))
    if err != nil {
        return err
    }
    *jsonTime = JsonTime(t)
    return nil
}

定义Struct   若字段是时间类型的 就设置成 JsonTime类型

// json的作用用于标记 序列化时的输出
type Student struct {
    Id          int      `json:"id"`    // 这里的json表示序列化时小写
    Name        string   `json:"name"`
    HomeAddress string   `json:"homeAddress"`
    CreateTime  JsonTime `json:"createTime"`   // ****** 注意序列化与反序列化关键在于类型JsonTime
}

实现序列化与反序列化

package main

import (
    "encoding/json"
    "fmt"
    "go_code/mytwo/bbb"
    "runtime/debug"
    "sort"
    "strconv"
    "strings"
    "time"
)

func main() {
    // struct 序列化与反序列化
    var student = Student{1, "张三", "江西", JsonTime(time.Date(2024, 5, 25, 20, 8, 23, 28, time.Local))}
    jsonByte, err := json.Marshal(&student)   // 通过encoding/json包里的Marshal序列化
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println("结果:", string(jsonByte))
    }
    jsonStr := string(jsonByte)
    student2 := new(Student)
    err = json.Unmarshal([]byte(jsonStr), &student2)// 通过encoding/json包里的Unmarshal反序列化
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(student2, "时间", time.Time(student2.CreateTime))
    }

}

还可以通过Gob对Struct 进行序列化与反序列化

标准库gob是golang提供的“私有”的编解码方式,它的效率会比json,xml等更高,特别适合在Go语言程序间传递数据

序列化

package main
 
import (
 "bytes"
 "encoding/gob"
 "fmt"
)
 
type Girl struct {
 Name    string
 Age    int  `json:"age"`
 Gender   string `json:"gender"`
 Where   string `json:"where"`
 Is_married bool  `json:"is_married"`
}
 
func main() {
 g := Girl{"satori", 16, "f", "东方地灵殿", false}
 
 //创建缓存
 buf := new(bytes.Buffer)
 //把指针丢进去
 enc := gob.NewEncoder(buf)
 
 //调用Encode进行序列化
 if err := enc.Encode(g); err != nil {
 fmt.Println(err)
 return
 } else {
 //序列化的内容会被放进buf里面
 fmt.Println(buf.String())
 /*
 G��Girl�� Name Age Gender Where 
 Is_married  !��satori f东方地灵殿
 */
 }
}

发现是乱码,因为这类似python的pickle,是该语言独有的。所以我们不认识没关系,golang认识就行了

反序列化

package main
 
import (
 "bytes"
 "encoding/gob"
 "fmt"
)
 
type Girl struct {
 Name    string
 Age    int  `json:"age"`
 Gender   string `json:"gender"`
 Where   string `json:"where"`
 Is_married bool  `json:"is_married"`
}
 
func main() {
 g := Girl{"satori", 16, "f", "东方地灵殿", false}
 
 buf := new(bytes.Buffer)
 enc := gob.NewEncoder(buf)
 if err := enc.Encode(g);err != nil {
 fmt.Println(err)
 return
 }
 
 var g1 = Girl{}
 //bytes.NewBuffer和bytes.Buffer类似,只不过可以传入一个初始的byte数组,返回一个指针
 dec := gob.NewDecoder(bytes.NewBuffer(buf.Bytes()))
 //调用Decode方法,传入结构体对象指针,会自动将buf.Bytes()里面的内容转换成结构体
 if err := dec.Decode(&g1);err != nil {
 fmt.Println(err)
 return
 } else {
 fmt.Println(g1) // {satori 16 f 东方地灵殿 false}
 }
}

 

 

标签:string,err,fmt,Golang,首字母,json,time,序列化
From: https://www.cnblogs.com/yingger/p/18212778

相关文章

  • 【启程Golang之旅】基本变量与类型讲解
    欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了解这门语言的基础知识和实用技巧。目录变量的概念数据类型的概念数据类型转换基本......
  • Golang:使用go-resty/resty发送http请求get和post
    Golang:使用go-resty/resty发送http请求get和post原创 吃个大西瓜 CodingBigTree 2024-05-2508:00 北京 听全文 go-resty/resty是一个简单的HTTP和REST客户端,受到Rubyrest-client的启发文档https://github.com/go-resty/resty/安装go get github......
  • Golang初学:项目目录结构,project-layout 项目
    goversiongo1.22.1windows/amd64Windows11+amd64x86_64x86_64GNU/Linux--- 序章golang项目的代码要怎么组织?怎么放比较简洁易读?看下面这个项目就晓得了。 project-layouthttps://github.com/golang-standards/project-layout注,有时访问失败。特写文记录。......
  • Golang 实现Java的AES ECB 加密
    JavapublicstaticStringencryptAesEcb(Stringtarget,StringsKey)throwsException{byte[]raw=sKey.getBytes("UTF-8");//"AES"就是用AES/ECB/PKCS5PaddingSecretKeySpecskeySpec=newSecretKeySpec(raw,......
  • 【Golang】在Go语言中如何实现接口
    文章目录前言一、函数解释二、代码实现三、总结前言接口是Go语言中的一个核心概念,它为类型定义了行为。接口提供了一种方式,使得不同的类型可以被同样对待,只要它们实现了相同的接口。在这篇博客中,我们将讨论如何在Go语言中实现接口。一、函数解释在Go语言中,接口是......
  • golang 的学习曲线
     Go(Golang)语言的设计目标之一就是让其学习曲线尽可能平缓,这意味着对于大多数开发者来说,学习Go语言比许多其他现代编程语言可能更快上手。以下是通常Golang学习曲线的一个概述:1入门阶段: 基本语法:Go语言的语法相对简单,与C/C++和Java有一定的相似性,所以对于有这些背景的开发......
  • 类转词典 转json 序列化 魔术方法
      classTest:def__init__(self,totals,uniques,pre):self.totals=totalsself.uniques=uniquesself.cumulative_sum=totalsifpre:self.cumulative_sum+=pre.cumulative_sumpre=Test(......
  • Golang初学:获取主机的磁盘空间信息,gopsutil
    goversiongo1.22.1windows/amd64Windows11+amd64x86_64x86_64GNU/Linux--- 序章怎么获取磁盘空间信息呢?总量、剩余等。包括,Windows、Linux主机等。使用标准库(os、fs、syscall等)可以吗?可以,网上可以找到获取Linux系统的相关信息,不过,要获取Windows的就比较麻烦......
  • golang微服务之go-zero零基础实战
    golang微服务之go-zero零基础实战1.环境准备mysql提供rpc服务接口后端交互存储etcd提供rpc服务注册与发现2.文件结构rpc服务接口:1.用户登录2.用户创建3.查询用户信息api服务接口:1.用户登录2.用户创建3.查询用户信息3.搭建步骤1.搭建rpc服务创建rpc......
  • Golang初学:vs code, launch.json, Run
    goversiongo1.22.1windows/amd64Windows11+amd64x86_64x86_64GNU/Linuxvscode1.89.1--- 序章在vscode开发go程序,之前总是在终端(terminal)输入命令(gorun.)来执行。不过,这不是最高效的方式。通过添加并配置launch.json可以更方便地程序仅运行(Ctrl+F5......