我想创建一个函数来接收一个输入字符串,该字符串可以是json格式的字符串,也可以只是一个字符串。例如,像跟随功能一样简单。
func checkJson(input string){
if ... input is in json ... {
fmt.Println("it's json!")
} else {
fmt.Println("it's normal string!")
}
}
答案 0 :(得分:33)
对于其他任何寻求验证任何JSON字符串而不管架构的方法的人,请尝试以下方法:
func IsJSON(str string) bool {
var js json.RawMessage
return json.Unmarshal([]byte(str), &js) == nil
}
答案 1 :(得分:18)
我不清楚你是否需要知道一个"引用的字符串"或者如果您需要了解json或两者之间的差异,那么这将向您展示如何检测这两种情况,以便您可以非常具体。
我也在这里发布了交互式代码示例:http://play.golang.org/p/VmT0BVBJZ7
package main
import (
"encoding/json"
"fmt"
)
func isJSONString(s string) bool {
var js string
return json.Unmarshal([]byte(s), &js) == nil
}
func isJSON(s string) bool {
var js map[string]interface{}
return json.Unmarshal([]byte(s), &js) == nil
}
func main() {
var tests = []string{
`"Platypus"`,
`Platypus`,
`{"id":"1"}`,
}
for _, t := range tests {
fmt.Printf("isJSONString(%s) = %v\n", t, isJSONString(t))
fmt.Printf("isJSON(%s) = %v\n\n", t, isJSON(t))
}
}
哪个会输出:
isJSONString("Platypus") = true
isJSON("Platypus") = false
isJSONString(Platypus) = false
isJSON(Platypus) = false
isJSONString({"id":"1"}) = false
isJSON({"id":"1"}) = true
答案 2 :(得分:6)
例如,
package main
import (
"encoding/json"
"fmt"
)
func isJSONString(s string) bool {
var js string
err := json.Unmarshal([]byte(s), &js)
return err == nil
}
func main() {
fmt.Println(isJSONString(`"Platypus"`))
fmt.Println(isJSONString(`Platypus`))
}
输出:
true
false
答案 3 :(得分:2)
标准class Robot:
def __init__(self):
pass
def __int__(self):
return 12
print(int(Robot())) # Should print 12.
库包含从{1.9开始的json.Valid函数 - 请参阅https://github.com/golang/go/issues/18086。此函数可用于检查提供的字符串是否是有效的json:
encoding/json
但与fastjson.Validate等第三方解决方案相比,if json.Valid(input) {
// input contains valid json
}
可能会相当缓慢,第三方解决方案比标准json.Valid
快5倍 - 请参阅json.Valid
部分benchmarks
答案 4 :(得分:2)
这可能是标准库中实际功能的较早发布。
但是您可以只使用“ encoding / json”包中的json.Valid()函数。
var tests = []string{
`"Platypus"`,
`Platypus`,
`{"id":"1"}`,
`{"id":"1}`,
}
for _, t := range tests {
fmt.Printf("is valid: (%s) = %v\n", t, json.Valid([]byte(t)))
}
答案 5 :(得分:1)
当前接受的答案(截至2017年7月)对于JSON数组失败且尚未更新:https://repl.it/J8H0/10
试试这个:
func isJSON(s string) bool {
var js interface{}
return json.Unmarshal([]byte(s), &js) == nil
}
或William King的解决方案,这是更好的。
答案 6 :(得分:0)
你怎么用这样的东西:
if err := json.Unmarshal(input, temp_object); err != nil {
fmt.Println("it's normal string!")
} else {
fmt.Println("it's json!")
}
答案 7 :(得分:0)
在搜索此问题的答案时,我找到了https://github.com/asaskevich/govalidator,该帖子与此博客文章相关,后者描述了创建输入验证程序:https://husobee.github.io/golang/validation/2016/01/08/input-validation.html。为了防止有人正在寻找一个快速库,我认为将该工具放在一个易于查找的地方会很有用。
此包使用与William King建议的isJSON相同的方法,如下所示:
// IsJSON check if the string is valid JSON (note: uses json.Unmarshal).
func IsJSON(str string) bool {
var js json.RawMessage
return json.Unmarshal([]byte(str), &js) == nil
}
这个软件包让我对go中的JSON有了更深入的了解,所以放在这里似乎很有用。