json - 在 golang 中检查 JSON 字符串是否有效
问题描述
我想检查来自我的应用程序的接口是否是有效的 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 main
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 (
"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
推荐阅读
- python - 如何从我构建的玩具机器学习 API 中为每个预测返回多个 JSON 元素?
- bash - 重击:查找 | sed | xargs rm 不起作用,但 rm 可以
- php - php,无法写入文件
- c# - 如何在作为复选框的 datagridview 列中填充更新表单上的复选框?
- javascript - 如何使用finally通过promise链传递变量
- unity3d - 全局脚本对象
- node.js - 即使使用keepalive,对烧瓶服务器的axios请求也不使用相同的TCP连接/端口
- java - 使用 `IntStream` 分两步迭代
- python - 如何将两个经纬度浮点数转换为 Google Maps latlng?
- apache2.4 - Symfony 4.3 总是返回无效的 CSRF 令牌