1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側工具欄

      新聞中心

      這里有您想知道的互聯(lián)網營銷解決方案
      golang如何自定義json序列化應用詳解

      前言

      在黑龍江等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網站設計、做網站 網站設計制作按需搭建網站,公司網站建設,企業(yè)網站建設,成都品牌網站建設,成都全網營銷推廣,成都外貿網站建設公司,黑龍江網站建設費用合理。

      Go語言作為一個由Google開發(fā),號稱互聯(lián)網的C語言的語言,自然也對JSON格式支持很好。下面這篇文章主要介紹了關于golang自定義json序列化應用的相關內容,下面話不多說了,來一起看看詳細的介紹吧

      問題引入

      當某個struct存在某個字段為string或者[]byte類型但是實際上保存的內容是json格式的數(shù)據時,對其進行json序列化,比如

      type Message struct {
       From string  `json:"from"`
       To string  `json:"to"`
       Data string `json:"data"`
      }
      
      func main() {
       msg := Message{
        From: "XiaoMing",
        To: "LiGang",
        Data: `{"title":"test","body":"something"}`,
       }
       jsonData, err := json.Marshal(msg)
       if err != nil {
        panic(err)
       }
       fmt.Println(string(jsonData))
      }

      在上面的例子中,Data字段是string類型,但是保存的內容是json格式的數(shù)據,這個時候,程序輸出:

      {"from":"XiaoMing","to":"LiGang","data":"{\"title\":\"test\",\"body\":\"something\"}"}

      可以看到,序列化之后的data是一個字符串。

      如果Message對應的是數(shù)據庫中的一張表,而data字段在數(shù)據庫中是json類型,當我們需要一個接口,查詢Message表中的記錄返回給客戶端。如果直接執(zhí)行序列化,那么客戶端獲取到的Data實際上是一個字符串,客戶端還需要自行對這個字符串進行json反序列化。

      這時候我們就會想,有沒有什么辦法能夠在服務端序列化Message時,將data字段序列化成json對象而不是字符串呢?

      自定義序列化

      因為data字段的值本身就是json類型,為什么不能在序列化時直接使用呢?

      查看json包的官方文檔,我們可以發(fā)現(xiàn)關于 自定義序列化 的例子

      當執(zhí)行json序列化時,如果對應的類型實現(xiàn)了 Marshaler 接口:

      type Marshaler interface {
       MarshalJSON() ([]byte, error)
      }

      那么就會執(zhí)行其 MarshalJSON 方法,并將返回的字節(jié)數(shù)組作為該值的序列化值。

      那么回到上面的例子,我們就很容易實現(xiàn)目標:

      type JsonString string
      
      func (j JsonString) MarshalJSON() ([]byte, error) {
       fmt.Println("marshal...")
       return []byte(j), nil
      }
      
      type Message struct {
       From string  `json:"from"`
       To string  `json:"to"`
       Data JsonString `json:"data"`
      }

      在上面的代碼中基于 string 類型聲明了 JsonString ,代表json格式的字符串,并實現(xiàn)了Marshaler接口。因為JsonString代表的就是json字符串,直接將其轉換成字節(jié)數(shù)組返回。

      然后將Message中的Data字段換成JsonString類型。

      再次執(zhí)行程序,可以看到:

      {"from":"XiaoMing","to":"LiGang","data":{"title":"test","body":"something"}}

      Perfect!

      總結

      以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。


      網站標題:golang如何自定義json序列化應用詳解
      標題鏈接:http://www.ef60e0e.cn/article/jhgioe.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        濮阳县| 九龙县| 浦城县| 长岛县| 柳州市| 抚松县| 资中县| 揭西县| 宁强县| 浏阳市| 兴国县| 阳泉市| 南安市| 阿拉善左旗| 广西| 吐鲁番市| 木兰县| 弥渡县| 玉山县| 渭南市| 澄江县| 遵义市| 桐梓县| 岢岚县| 广平县| 改则县| 射阳县| 武鸣县| 双桥区| 舟山市| 翁源县| 太谷县| 阳朔县| 双桥区| 龙海市| 清苑县| 辽源市| 琼海市| 金川县| 南平市| 大方县|