最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Go語言如何解析帶注釋的json

 更新時間:2024年03月25日 08:24:28   作者:qinyuan15  
標(biāo)準(zhǔn)的json格式是不帶注釋,但是有時候為了方便理解json中各字段的含義,需要支持帶注釋的json,這篇文章主要介紹了Go語言解析帶注釋json的相關(guān)方法,希望對大家有所幫助

一、背景和意義

標(biāo)準(zhǔn)的json格式是不帶注釋,但是有時候為了方便理解json中各字段的含義,需要支持帶注釋的json。例如在日常工作中常用的接口文檔管理平臺yapi在配置接口參數(shù)與接口返回、或者創(chuàng)建mock數(shù)據(jù)時,就支持配置帶注釋的json。本文給出用go語言解析帶注釋的json的示例。

二、go語言解析普通json

go語言官方自帶的json庫可以解析普通的json。例如,我們創(chuàng)建一個main.go文件,代碼如下:

package main

import (
   "encoding/json"
   "fmt"
)

type user struct {
   Name    string
   Age     int
   Address struct {
      City    string
      Country string
   }
}

func main() {
   jsonStr := `{
        "name": "ZhangSan",
        "age": 11,
        "address": {
          "city": "Shanghai",
          "country": "China"
        }
      }`
   user := &user{}
   err := json.Unmarshal([]byte(jsonStr), user)
   if err != nil {
      fmt.Printf("json解析失?。?+v", err)
   } else {
      fmt.Printf("json解析結(jié)果:%+v", user)
   }
}

運行go run main.go命令,運行結(jié)果為:

json解析結(jié)果:&{Name:ZhangSan Age:11 Address:{City:Shanghai Country:China}}

但是假如我們在json中增加以// ... 或者/* ... */格式的注釋:

package main

import (
   "encoding/json"
   "fmt"
)

type user struct {
   Name    string
   Age     int
   Address struct {
      City    string
      Country string
   }
}

func main() {
   jsonStr := `{
        "name": "ZhangSan",    // 姓名
        "age": 11,             // 年齡
        /* 地址信息 開始 */
        "address": {
          "city": "Shanghai",
          "country": "China"
        }
        /* 地址信息 結(jié)束 */
      }`
   user := &user{}
   err := json.Unmarshal([]byte(jsonStr), user)
   if err != nil {
      fmt.Printf("json解析失?。?+v", err)
   } else {
      fmt.Printf("json解析結(jié)果:%+v", user)
   }
}

然后執(zhí)行命令go run main.go,可看到運行結(jié)果為:

json解析失?。篿nvalid character '/' looking for beginning of object key string

三、go語言解析帶注釋json

使用github.com/titanous/json5庫可以解析帶注釋的json

package main

import (
   "fmt"
   "github.com/titanous/json5"
)

type user struct {
   Name     string
   Age      int
   HomePage string
   Address  struct {
      City    string
      Country string
   }
}

func main() {
   jsonStr := `{
        "name": "ZhangSan",    // 姓名
        "age": 11,             // 年齡
        /* 地址信息 開始 */
        "address": {
          "city": "Shanghai",
          "country": "China"
        }
        /* 地址信息 結(jié)束 */
      }`
   user := &user{}
   err := json5.Unmarshal([]byte(jsonStr), user)
   if err != nil {
      fmt.Printf("json解析失?。?+v", err)
   } else {
      fmt.Printf("json解析結(jié)果:%+v", user)
   }
}

運行結(jié)果如下:

json解析結(jié)果:&{Name:ZhangSan Age:11 HomePage: Address:{City:Shanghai Country:China}}

四、其他特殊情況驗證

按理來說,按理來說,// .../* ... */如果是出現(xiàn)在字符串中,那么他們不應(yīng)該為注釋處理,我們驗證一下github.com/titanous/json5是否能夠正確如果這種情況,將main.go文件修改為:

package main

import (
   "fmt"
   "github.com/titanous/json5"
)

type user struct {
   Name     string
   Age      int
   HomePage string
   Comment  string
   Address  struct {
      City    string
      Country string
   }
}

func main() {
   jsonStr := `{
        "name": "ZhangSan",    // 姓名
        "age": 11,             // 年齡

        /* homePage字段的值中有"http://",但它不應(yīng)該被作為注釋處理 */
        "homePage": "https://www.testpage.com/index.html",
        "comment": "此處測試一下,/* 這里的注釋是否能夠正確解析 */",

        /* 地址信息 開始 */
        "address": {
          "city": "Shanghai",
          "country": "China"
        }
        /* 地址信息 結(jié)束 */
      }`
   user := &user{}
   err := json5.Unmarshal([]byte(jsonStr), user)
   if err != nil {
      fmt.Printf("json解析失?。?+v", err)
   } else {
      fmt.Printf("json解析結(jié)果:%+v", user)
   }
}

運行結(jié)果為:

json解析結(jié)果:&{Name:ZhangSan Age:11 HomePage:https://www.testpage.com/index.html Comment:此處測試一下,/* 這里的注釋是 否能夠正確解析 */ Address:{City:Shanghai Country:China}}

可以看到,github.com/titanous/json5對于這種特殊情況的處理也是完全正確的。

到此這篇關(guān)于詳解Go語言如何解析帶注釋的json的文章就介紹到這了,更多相關(guān)Go解析帶注釋json內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go中Context使用源碼解析

    Go中Context使用源碼解析

    這篇文章主要為大家介紹了Go中Context使用源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Go語言中函數(shù)的參數(shù)傳遞與調(diào)用的基本方法

    Go語言中函數(shù)的參數(shù)傳遞與調(diào)用的基本方法

    這篇文章主要介紹了Go語言中函數(shù)的參數(shù)傳遞與調(diào)用的基本方法,是golang入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • 使用Golang進行比較版本號大小

    使用Golang進行比較版本號大小

    在日常開發(fā)中,比較版本號大小的情況是經(jīng)常遇到的,這篇文章主要為大家詳細(xì)介紹了如何使用Golang進行比較版本號大小,需要的小伙伴可以參考下
    2024-01-01
  • 15個Golang中時間處理的實用函數(shù)

    15個Golang中時間處理的實用函數(shù)

    在Go編程中,處理日期和時間是一項常見任務(wù),涉及到精確性和靈活性,本文將介紹一系列實用函數(shù),它們充當(dāng)time包的包裝器,需要的可以參考下
    2024-01-01
  • 使用golang獲取linux上文件的訪問/創(chuàng)建/修改時間

    使用golang獲取linux上文件的訪問/創(chuàng)建/修改時間

    這篇文章主要介紹了使用golang獲取linux上文件的訪問/創(chuàng)建/修改時間,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • Golang二進制反匯編問題

    Golang二進制反匯編問題

    這篇文章主要介紹了Golang二進制反匯編問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • golang國內(nèi)proxy設(shè)置方式

    golang國內(nèi)proxy設(shè)置方式

    建議使用goproxy.cn作為Go包鏡像,因其速度快且緩存豐富,若遇下載問題可更換源,同時注意GitHub刪除的包可能在goproxy.io中緩存
    2025-07-07
  • golang變量uint、int大小溢出后的結(jié)果方式

    golang變量uint、int大小溢出后的結(jié)果方式

    在Go語言中,變量的大小溢出后,`uint`類型會回繞到最小值,而`int`類型會回繞到最大值的相反數(shù),例如,`uint8`溢出后會變成0,`int64`溢出后會變成最小的負(fù)數(shù)
    2024-12-12
  • golang return省略用法說明

    golang return省略用法說明

    這篇文章主要介紹了golang return省略用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang中異常處理機制詳解

    Golang中異常處理機制詳解

    這篇文章主要給大家介紹了關(guān)于Golang中異常處理機制的相關(guān)資料,其實Go語言的異常捕獲要比Python中簡單的多,它沒有Python中那么多復(fù)雜的異常類型及繼承體系,需要的朋友可以參考下
    2021-06-06

最新評論

晋城| 鄂温| 蒙山县| 阜阳市| 红河县| 苏州市| 武强县| 清原| 涿州市| 阿坝| 长葛市| 图木舒克市| 会泽县| 沙河市| 东光县| 呼伦贝尔市| 黄石市| 镇雄县| 南丹县| 凤台县| 军事| 当雄县| 商河县| 博湖县| 衡东县| 鄂伦春自治旗| 长顺县| 金平| 都昌县| 拉孜县| 台中县| 当涂县| 都昌县| 阿勒泰市| 霞浦县| 杭锦旗| 廊坊市| 离岛区| 车致| 固安县| 谷城县|