欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2024年03月25日 08:24:28   作者:qinyuan15  
標準的json格式是不帶注釋,但是有時候為了方便理解json中各字段的含義,需要支持帶注釋的json,這篇文章主要介紹了Go語言解析帶注釋json的相關(guā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)在字符串中,那么他們不應該為注釋處理,我們驗證一下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://",但它不應該被作為注釋處理 */
        "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語言實現(xiàn)字符串切片賦值的方法小結(jié)

    Go語言實現(xiàn)字符串切片賦值的方法小結(jié)

    這篇文章主要給大家介紹了Go語言實現(xiàn)字符串切片賦值的兩種方法,分別是在for循環(huán)的range中以及在函數(shù)的參數(shù)傳遞中實現(xiàn),有需要的朋友們可以根據(jù)自己的需要選擇使用。下面來一起看看吧。
    2016-10-10
  • Windows環(huán)境下vscode-go安裝筆記(不支持32位)

    Windows環(huán)境下vscode-go安裝筆記(不支持32位)

    這篇文章主要介紹了Windows環(huán)境下vscode-go安裝筆記(不支持32位),需要的朋友可以參考下
    2017-02-02
  • Golang?Makefile示例深入講解使用

    Golang?Makefile示例深入講解使用

    一次偶然的機會,在?github?上看到有人用?Makefile,就嘗試了一下,發(fā)現(xiàn)真的非常合適,Makefile?本身就是用來描述依賴的,可讀性非常好,而且與強大的?shell?結(jié)合在一起,基本可以實現(xiàn)任何想要的功能
    2023-01-01
  • golang如何去除 context 的 deadline

    golang如何去除 context 的 deadline

    在使用 context 的時候遇到了開協(xié)程處理任務的情況,但是直接在協(xié)程里使用主線程的 context 會導致當主線程返回時協(xié)程任務也會因為 context cancel 而失敗,本文提供了兩種辦法可以取消掉 context 里的 timeout 和 deadline,再設(shè)置一個新的 timeout 上去
    2023-03-03
  • Go語言接口與多態(tài)詳細介紹

    Go語言接口與多態(tài)詳細介紹

    Go語言的接口類型是一組方法定義的集合,它體現(xiàn)了多態(tài)性、高內(nèi)聚和低耦合的設(shè)計思想,接口通過interface關(guān)鍵字定義,無需實現(xiàn)具體方法,任何實現(xiàn)了接口所有方法的類型即視為實現(xiàn)了該接口,感興趣的朋友一起看看吧
    2024-09-09
  • 使用Golang實現(xiàn)加權(quán)負載均衡算法的實現(xiàn)代碼

    使用Golang實現(xiàn)加權(quán)負載均衡算法的實現(xiàn)代碼

    這篇文章主要介紹了使用Golang實現(xiàn)加權(quán)負載均衡算法的實現(xiàn)代碼,詳細說明權(quán)重轉(zhuǎn)發(fā)算法的實現(xiàn),通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Golang實現(xiàn)HTTP代理突破IP訪問限制的步驟詳解

    Golang實現(xiàn)HTTP代理突破IP訪問限制的步驟詳解

    在當今互聯(lián)網(wǎng)時代,網(wǎng)站和服務商為了維護安全性和保護用戶隱私,常常會對特定的IP地址進行封鎖或限制,本文將介紹如何使用Golang實現(xiàn)HTTP代理來突破IP訪問限制,需要的朋友可以參考下
    2023-10-10
  • 關(guān)于升級go1.18的goland問題詳解

    關(guān)于升級go1.18的goland問題詳解

    作為一個go語言程序員,覺得自己有義務為go新手開一條更簡單便捷的上手之路,下面這篇文章主要給大家介紹了關(guān)于升級go1.18的goland問題的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 解決Golang中g(shù)oroutine執(zhí)行速度的問題

    解決Golang中g(shù)oroutine執(zhí)行速度的問題

    這篇文章主要介紹了解決Golang中g(shù)oroutine執(zhí)行速度的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • go語言中字符串嵌套的幾種實現(xiàn)方式

    go語言中字符串嵌套的幾種實現(xiàn)方式

    在Go語言中,字符串嵌套可以通過多種方式實現(xiàn),包括使用雙引號和轉(zhuǎn)義字符、反引號、字符串拼接和格式化字符串,下面就來介紹一下,感興趣的可以了解一下
    2025-03-03

最新評論