go裡面如何將[]int json序列化為[]string?

hanyajun發表於2019-08-09

背景

有時我們會遇到必須用 int64 的情景 (snowflake id 等),這個時候會遇到一個很尷尬的問題,就是 js 的 number 型別最大隻支援 2^53,就會出現精度丟失的情況,這個時候最好是用 string 與前端互動比較合適。

對於單一的 int 序列化為 string

type Demo struct {
    ID int64 `json:"id,string"`
}

注意 json tag 以下的用法:

"json"標籤的用法:

1、json:"-":編碼的時候會忽略這個欄位。

2、json:"newName":指定欄位在 JSON 字串的 key 名字。

3、json:"newName,omitempty":如果這個欄位是空值,則不編碼到 JSON 裡面,否則用 newName 為名字編碼。

4、json:",omitempty":同上,不為空的話,這個欄位的 key 還是用預設的 struct 欄位名。

5、json:",string":編碼成字串,這個 string 選項只適用字串,浮點型和整型資料。

struct 欄位需要可匯出才能編碼成 json,否則會忽略。

將 [] int 序列化為 [] string

這裡就需要用到自定義序列化,也就是實現 json/encode 裡面的 MarshalJson 和 UnmarshalJson 方法。

package main

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

/*
* @Author:hanyajun
* @Date:2019/8/6 10:21
* @Name:json
* @Function:
 */

type IntString int64

type RequestParam struct {
    LoadWaybills []IntString `json:"load_waybills"`
}

func (i IntString) MarshalJSON() ([]byte, error) {
    return []byte(fmt.Sprintf("\"%v\"", i)), nil
}

func (i *IntString) UnmarshalJSON(value []byte) error {
    m, err := strconv.ParseInt(string(value[1:len(value)-1]), 10, 32)
    if err != nil {
        return err
    }
    *i = IntString(m)
    return nil
}

func main() {
    var a int64 = 90
    var result = &RequestParam{LoadWaybills: []IntString{IntString(a), 123}}
    b, _ := json.Marshal(result)
    fmt.Printf("marshal result:%s\n", b)
    var result2 RequestParam
    _ = json.Unmarshal(b, &result2)
    fmt.Printf("unmarshal result:%v", result2.LoadWaybills)
}

輸出結果

marshal result:{"load_waybills":["123","567"]}
unmarshal result:[90 123]
更多原創文章乾貨分享,請關注公眾號
  • go裡面如何將[]int  json序列化為[]string?
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章