亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 golang 中檢查 JSON 字符串是否有效

在 golang 中檢查 JSON 字符串是否有效

Go
冉冉說 2022-06-27 16:24:35
我想檢查來自我的應用程序的接口是否是有效的 json。我已經搜索過了。它可能是這里的重復:重復(但它不起作用)我找到了一些方法。其中之一是編組然后解組接口,如下面的代碼:func isJSONClasic(i interface{}) bool {    x, err := json.Marshal(i)    if err != nil {        fmt.Printf("error: %+v\n", err)    }    var temp interface{}    return json.Unmarshal(x, &temp) == nil}我使用的另一種方法是 gjson 包。根據此處的文檔,它具有ValidBytes方法。它需要一個字節數組并返回驗證。我使用的功能如下:func isJSONGjson(i interface{}) bool {    x, err := json.Marshal(i)    if err != nil {        fmt.Printf("error: %+v\n", err)    }    return gjson.ValidBytes(x)}我使用的示例數據是{"name""latif"}。很容易看出它不是一個有效的 json。(我也在這里測試過)當我用 2 個函數測試數據時,我希望它們應該打印 false 作為驗證的結果,但我對它們都正確。我測試的整個代碼和結果如下: package mainpackage mainimport (    "encoding/json"    "fmt"    "github.com/tidwall/gjson")func main() {    var data interface{}    data = `{"name""latif"}`    isValid := isJSONClasic(data)    fmt.Printf("%+v\n", isValid)    isValid = isJSONGjson(data)    fmt.Printf("%+v\n", isValid)}func isJSONClasic(i interface{}) bool {    x, err := json.Marshal(i)    if err != nil {        fmt.Printf("error: %+v\n", err)    }    var temp interface{}    return json.Unmarshal(x, &temp) == nil}func isJSONGjson(i interface{}) bool {    x, err := json.Marshal(i)    if err != nil {        fmt.Printf("error: %+v\n", err)    }    return gjson.ValidBytes(x)}輸出如下:即使樣本數據無效,我也是如此。這里有什么問題?如何使用 golang 學習 json 是否有效?
查看完整描述

1 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

這里有一個例子:


package main


import (

    "bytes"

    "encoding/gob"

    "encoding/json"

    "fmt"

)


func main() {

    var data interface{}

    data = `{"name""latif"}`

    valid := `{"name":"latif"}`


    isValid := isValidJSON(data)

    fmt.Printf("%+v\n", isValid)

    isValid = isValidJSON(valid)

    fmt.Printf("%+v\n", isValid)

}


func isValidJSON(i interface{}) bool {

    var str map[string]string

    data, err := getBytes(i)

    if err != nil {

        panic(err.Error())

    }

    data = data[4:]

    err = json.Unmarshal(data, &str)

    return err == nil

}


func getBytes(i interface{}) ([]byte, error) {

    var buf bytes.Buffer

    enc := gob.NewEncoder(&buf)

    err := enc.Encode(i)

    if err != nil {

        return nil, err

    }

    return buf.Bytes(), nil

}

注意:編碼后的前4個字節interface必須[]byte被刪除


結果:


false

true


查看完整回答
反對 回復 2022-06-27
  • 1 回答
  • 0 關注
  • 281 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號