如何检查字符串是json格式

时间:2014-03-02 13:37:54

标签: json go

我想创建一个函数来接收一个输入字符串,该字符串可以是json格式的字符串,也可以只是一个字符串。例如,像跟随功能一样简单。

func checkJson(input string){
   if ... input is in json ... {
      fmt.Println("it's json!")
   } else {
      fmt.Println("it's normal string!")
   }
}

8 个答案:

答案 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)))
    
}

示例https://play.golang.org/p/nfvOzQB919s

答案 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有了更深入的了解,所以放在这里似乎很有用。