How to check string is in json format
I was unclear if you needed to know about just a "quoted string" or if you needed to know about json, or the difference between both of them, so this shows you how to detect both scenarios so you can be very specific.
I posted the interactive code sample here as well: 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))
}
}
Which will output this:
isJSONString("Platypus") = true
isJSON("Platypus") = false
isJSONString(Platypus) = false
isJSON(Platypus) = false
isJSONString({"id":"1"}) = false
isJSON({"id":"1"}) = true
Standard encoding/json
library contains json.Valid function starting from go 1.9 - see https://github.com/golang/go/issues/18086 . This function may be used for checking whether the provided string is a valid json:
if json.Valid(input) {
// input contains valid json
}
But json.Valid
may be quite slow comparing to third-party solutions such as fastjson.Validate, which is up to 5x faster than the standard json.Valid
- see json validation
section in benchmarks.
For anyone else looking for a way to validate any JSON string regardless of schema, try the following:
func IsJSON(str string) bool {
var js json.RawMessage
return json.Unmarshal([]byte(str), &js) == nil
}
For example,
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`))
}
Output:
true
false