我想检查来自我的应用程序的接口是否是有效的 json。我已经搜索过。它可能与这里重复:duplicate(但它不起作用)我找到了一些方法。其中之一是对接口进行编组然后解组,如下代码所示:
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包。根据here中的文档,它有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。 (我也在here测试过) 当我使用这两个函数测试数据时,我预计它们应该打印 false 作为验证结果,但我对它们都得到了 true。 我测试的整个代码和结果如下: 包主
package main
import (
"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 是否有效?
试试这个
package main
import (
"encoding/json"
"fmt"
)
func main() {
fmt.Println("isJSON: ", isJSON("abc"))
fmt.Println("isJSON: ", isJSON("{}"))
fmt.Println("isJSON: ", isJSON("{a:22}"))
fmt.Println("isJSON: ", isJSON("[]"))
fmt.Println("isJSON: ", isJSON("[222,2223]"))
}
func isJSON(str string) bool {
fmt.Println("check", str)
var data map[string]interface{}
err := json.Unmarshal([]byte(str), &data)
if err == nil {
return true
} else {
//fmt.Println("check json format not object:", err)
}
var data2 []any
err = json.Unmarshal([]byte(str), &data2)
if err == nil {
return true
} else {
//fmt.Println("check json format not array:", err)
}
return false
}
check abc
isJSON: false
check {}
isJSON: true
check {a:22}
isJSON: false
check []
isJSON: true
check [222,2223]
isJSON: true
这里有一个例子:
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
}
注意:
interface
到[]byte
编码后的前4个字节必须被删除
结果:
false
true