1. 程式人生 > >Golang 奇葩的時間包之Json與struct物件之間互相轉換,JsonDate和JsonTime自定義型別如何實現json編碼和解碼(二)

Golang 奇葩的時間包之Json與struct物件之間互相轉換,JsonDate和JsonTime自定義型別如何實現json編碼和解碼(二)

本篇在專案中實用性極強,推薦珍藏

package main


import (
    "encoding/json"
    "fmt"
    "time"
)

type JsonDate time.Time
type JsonTime time.Time

func (p *JsonDate) UnmarshalJSON(data []byte) error {
    local, err := time.ParseInLocation(`"2006-01-02"`, string(data), time.Local)
    *p = JsonDate(local)
    return err
}

func (p *JsonTime) UnmarshalJSON(data []byte) error {
    local, err := time.ParseInLocation(`"2006-01-02 15:04:05"`, string(data), time.Local)
    *p = JsonTime(local)
    return err
}

func (c JsonDate) MarshalJSON() ([]byte, error) {
    data := make([]byte, 0)
    data = append(data, '"')
    data = time.Time(c).AppendFormat(data, "2006-01-02")
    data = append(data, '"')
    return data, nil
}

func (c JsonTime) MarshalJSON() ([]byte, error) {
    data := make([]byte, 0)
    data = append(data, '"')
    data = time.Time(c).AppendFormat(data, "2006-01-02 15:04:05")
    data = append(data, '"')
    return data, nil
}

func (c JsonDate) String() string {
    return time.Time(c).Format("2006-01-02")
}

func (c JsonTime) String() string {
    return time.Time(c).Format("2006-01-02 15:04:05")
}

func Todate(in string) (out time.Time, err error) {
    out, err = time.Parse("2006-01-02", in)
    return out, err
}

func Todatetime(in string) (out time.Time, err error) {
    out, err = time.Parse("2006-01-02 15:04:05", in)
    return out, err
}

type Human struct {
    Id       int64    `json:"id"`
    Name     string   `json:"name"`
    Birthday JsonTime `json:"birthday"` //注意:日期帶時分秒這樣的格式,日期部分yyyy-MM-dd不能使用帶斜線的格式
}

type Employee struct {
    Id       int64    `json:"id"`
    Name     string   `json:"name"`
    Birthday JsonDate `json:"birthday"` //注意:日期格式yyyy-MM-dd,日期不能使用帶斜線的格式
}

func main() {
    now := JsonTime(time.Now())
    fmt.Println("當前時間:", now)
    fmt.Println("========================================================================")

    Tom := `{"id":5,"name":"Tom","birthday":"2016-06-30 16:09:51"}`
    human := new(Human)
    //json使用struct物件來解碼 ------ json轉struct物件
    err1 := json.Unmarshal([]byte(Tom), &human)
    if err1 != nil {
        fmt.Println(err1)
    }
    fmt.Println("json轉struct物件: ", *human)
    fmt.Println("struct物件時間欄位:", human.Birthday)
    fmt.Println(time.Time(human.Birthday))

    fmt.Println("========================================================================")

    //struct物件使用json編碼 ------ struct物件轉json
    data1, _ := json.Marshal(human)
    fmt.Println("struct物件轉json:", string(data1))
    fmt.Println("\n\n")

    fmt.Println("***********************************************************************************************")
    fmt.Println("***********************************************************************************************")
    Jack := `{"id":8,"name":"Jack","birthday":"2016-06-30"}`
    employee := Employee{}
    //json使用struct物件來解碼 ------ json轉struct物件
    err2 := json.Unmarshal([]byte(Jack), &employee)
    if err2 != nil {
        fmt.Println(err2)
    }
    fmt.Println("json轉struct物件: ", employee)
    fmt.Println("struct物件時間欄位:", employee.Birthday)
    fmt.Println(time.Time(employee.Birthday))

    fmt.Println("========================================================================")

    //struct物件使用json編碼 ------ struct物件轉json
    data2, _ := json.Marshal(employee)
    fmt.Println("struct物件轉json:", string(data2))
    fmt.Println("\n\n")

    JsonData := `[{"id":15,"name":"Jason","birthday":"1986-06-14"},{"id":16,"name":"Tim","birthday":"1986-12-06"}]`
    var empList []Employee //定義一個切片
    //json使用struct物件來解碼 ------ json轉struct物件
    err3 := json.Unmarshal([]byte(JsonData), &empList)
    if err3 != nil {
        fmt.Println(err3)
    }
    fmt.Println("json轉struct物件: ", empList)
    fmt.Println("struct物件時間欄位:", empList[1].Birthday)
    fmt.Println(time.Time(empList[1].Birthday))

    fmt.Println("========================================================================")

    employees := make([]Employee, 0) //定義一個切片
    var date time.Time
    var err4 error
    date, err4 = Todate("1986-06-14") //字串轉time.Time型別
    if err4 != nil {
        fmt.Println(err4)
        return
    }
    jason := Employee{Id: 15, Name: "Jason", Birthday: JsonDate(date)} //Birthday: JsonDate(date),注意鍵值對賦值方式
    date, err4 = Todate("1986-12-06")                                  //字串轉time.Time型別
    if err4 != nil {
        fmt.Println(err4)
        return
    }
    tim := Employee{Id: 16, Name: "Tim", Birthday: JsonDate(date)}
    employees = append(employees, jason)
    employees = append(employees, tim)
    //struct物件使用json編碼 ------ struct物件轉json
    data3, _ := json.Marshal(employees)
    fmt.Println("struct物件集合轉json:", string(data3))
    fmt.Println("\n\n")
}

控制檯列印輸出:

2017/06/25 05:37:59 server.go:73: Using API v1
2017/06/25 05:37:59 debugger.go:97: launching process with args: [/root/code/go/src/contoso.org/hello/debug]
API server listening at: 127.0.0.1:2345
2017/06/25 05:37:59 debugger.go:505: continuing
當前時間: 2017-06-25 05:37:59
========================================================================
json轉struct物件:  {5 Tom 2016-06-30 16:09:51}
struct物件時間欄位: 2016-06-30 16:09:51
2016-06-30 16:09:51 +0800 CST
========================================================================
struct物件轉json: {"id":5,"name":"Tom","birthday":"2016-06-30 16:09:51"}
***********************************************************************************************
***********************************************************************************************
json轉struct物件:  {8 Jack 2016-06-30}
struct物件時間欄位: 2016-06-30
2016-06-30 00:00:00 +0800 CST
========================================================================
struct物件轉json: {"id":8,"name":"Jack","birthday":"2016-06-30"}
json轉struct物件:  [{15 Jason 1986-06-14} {16 Tim 1986-12-06}]
struct物件時間欄位: 1986-12-06
1986-12-06 00:00:00 +0800 CST
========================================================================
struct物件集合轉json: [{"id":15,"name":"Jason","birthday":"1986-06-14"},{"id":16,"name":"Tim","birthday":"1986-12-06"}]

相關推薦

Golang 奇葩時間Jsonstruct物件之間互相轉換JsonDateJsonTime定義型別如何實現json編碼解碼

本篇在專案中實用性極強,推薦珍藏 package main import (     "encoding/json"     "fmt"     "time" ) type JsonDate time.Time type JsonTime time.Time func (

JSONJava物件互相轉換

JSON與Java物件的互相轉換 例一(單個物件進行賦值): @RequestMapping("test1.do") @ResponseBody public JSONObject test1(HttpServletRequest request, HttpServletResponse

iOS開發OCswift開發混編教程代理的相互呼叫,block的實現。OC呼叫Swift中的代理 OC呼叫Swift中的Block 閉

  本文章將從兩個方向分別介紹 OC 與 swift 混編   1. 第一個方向從 swift工程 中引入 oc類    1. 1 如何在swift的類中使用oc類    1.2  如何在swift中實現oc的代理方法  &

iOS開發OCswift開發混編教程代理的相互呼叫,block的實現。OC呼叫Swift中的代理 OC呼叫Swift中的Block 閉swift 3.0

最新一些學妹問起,所以抽點時間來寫的,適合入門級別的swift 與 OC 混編 的程式猿。   本文章將從兩個方向分別介紹 OC 與 swift 混編   1. 第一個方向從 swift工程 中引入 oc類      1. 1 如何在swift的類中使用oc類     1

Python 時間-時-分-秒 秒數 的互相轉換

一:時間轉成秒數 st = "08:30:30" et = "9:33:33" #方法一 def t2s(t): h,m,s = t.strip().split(":") return int(h) * 3600 + int(m) * 60 +

Java基礎-類加載機制定義類Java類加載器ClassLoader

定義類 方式 blog 之前 www 筆記 通過 反射 加載機制          Java基礎-類加載機制與自定義類Java類加載器(ClassLoader)                                     作者:尹正傑 版權聲明:原創作品,謝絕轉

前端開發框架總結利用Jtopo實現網路拓撲功能

                    前端開發框架總結之利用Jtopo實現網路拓撲功能(二) 上文我們講了一些拓撲結點生成的實際場景設計和實現思路以及一些關鍵技術細節。本文我們繼續我們的拓撲管理

Qt總結:遍歷資料夾檔案目錄並過濾獲取檔案資訊、字尾名、字首名

前言 需要在特定目錄或磁碟下查詢特定檔案 一、篩選目錄 (一)單一目錄下遍歷,篩選特定檔案 QDir dir("./SaveFiles"); QFileInfoList list = dir.entryInfoList(); (二)裝置所有磁碟中遍歷 QF

jQuery物件DOM物件之間轉換方法

jQuery物件是包裝DOM物件後產生的,但是兩者卻不能混用,DOM物件才能使用DOM方法,jQuery物件才能使用jQuery方法,以下介紹兩者轉換的方法: jQuery物件轉成DOM物件: (1

java物件json物件之間互相轉換

import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import net.sf.json.JSONArray;

Python中的encodedecode詳解字串位元組物件之間轉換

1.相關異常我們在處理交換的資料時經常遇到這樣的異常:TypeError: can't use a string pattern on a bytes-like objectTypeError: a bytes-like object is required, not 'st

Xml字串C#物件之間相互轉換

我們常常需要讀取xml檔案,把裡面的資訊轉化為我們自定義的型別,或則吧自定義型別轉化為Xml字串。在這裡介紹一個比較簡單的物件轉化方法。在我自己的Framwork裡面也多次用到。裡面涉及到節點、屬性、集合。 示例一 該xml檔案涉及到屬性、節點集合不涉及個節點: <?x

golangjsonstruct中tag

使用 Golang 的 encoding/json 庫已經提供了很好的封裝,可以讓我們很方便地進行 JSON 資料的轉換。 Go 語言中資料結構和 JSON 型別的對應關係如下表: golang 型別 JSON 型別 注意事項 bool JSO

golangjsonstruct中tag簡介

使用 Golang 的 encoding/json 庫已經提供了很好的封裝,可以讓我們很方便地進行 JSON 資料的轉換。 Go 語言中資料結構和 JSON 型別的對應關係如下表: golang 型別 JSON 型別 注意事項 bool JSON boolean

手遊客戶端的效能篇----UnityC#版字串拼接StructClass的區別應用

接著上篇文章: 2、字串拼接(簡單,直接結論)        使用“a” + “b”在幾次(10次以內吧)連線是不會產生gc的但是大量連線就會產生;         連線多的用StringBuilder,內部

javasrcipt的作用域續篇:函式內部提升機制Variable Object

一個先有雞還是先有蛋的問題,先看一段程式碼: a = 2; var a; console.log(a); 通常我們都說JavaScript程式碼是由上到下一行一行執行,但實際這段程式碼輸出的結果是2。但這段程式碼並不能為我們要討論的問題提供完整的參考意義,所以再看一下程式碼: conso

Golang管理工具glide的使用

1. glide簡介 glide是一個golang專案的包管理工具,非常方便快捷,一般只需要2-3個命令就可以將go依賴包自動下載並歸檔到vendor的目錄中。glide官網參考:https://

淺談凸Andrew Graham

前言 腦補知識點: 1.向量的內積(數量積,點乘): 公式:a· b = |a| * |b| cos<a, b>=a.x* b.y + b.x * a.y 2.向量的外積(向量積,差乘): 公式:|c|= |a|*|b|*sin<a, b> = a

網路遊戲《叢林戰爭》開發學習:粘分包現象以及服務端解析資料

1. 粘包和分包 粘包和分包是利用Socket在TCP協議下內部的優化機制。粘包指的是傳送資料比較頻繁,但資料量較少,此時客戶端不會直接將資料包傳送給伺服器,而是會與其它的資料包進行一個結合,例如遊戲中的位置資訊就是屬於頻繁傳送但資料量小的資訊,此時如果每條資料都S

mysql進階細談索引、分頁慢日誌

連表 組合索引 rar 偏移量 最小值 num glob 要求 for 索引 1、數據庫索引   數據庫索引是一種數據結構,可以以額外的寫入和存儲空間為代價來提高數據庫表上的數據檢索操作的速度,以維護索引數據結構。索引用於快速定位數據,而無需在每次訪問數據庫表時搜索數據