如何解决在golang中检查JSON字符串是否有效
我想检查来自我的应用程序的接口是否为有效的json。我已经搜寻了。它可能是这里的副本:duplicate(但没有用)我找到了一些方法。其中之一是封送处理,然后取消封送处理接口,如以下代码所示:
func isJSONGjson(i interface{}) bool {
x,err := json.Marshal(i)
if err != nil {
fmt.Printf("error: %+v\n",err)
}
return gjson.ValidBytes(x)
}
我使用的另一种方法是gjson包。根据{{3}}中的文档,它具有 ValidBytes 方法。它需要一个字节的错误并返回验证。我使用的功能如下:
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)
}
var temp interface{}
return json.Unmarshal(x,&temp) == nil
}
func isJSONGjson(i interface{}) bool {
x,err)
}
return gjson.ValidBytes(x)
}
我使用的示例数据是 {“ name”“ latif”} 。很容易看出它不是有效的json。 (我也在here中进行了测试) 当我使用这两个函数测试数据时,我希望它们作为验证的结果应打印为false,但是对于这两个函数我都是正确的。 我测试的整个代码和结果如下: 包主
null
输出如下:
即使样本数据无效,我也是如此。这是怎么了如何通过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
}
注意:interface
至[]byte
编码后的前4个字节必须删除
结果:
false
true
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。