在golang中检查字符串的简单方法是json格式?

A-l*_*bby 22 json go

我想创建一个函数来接收一个输入字符串,该字符串可以是json格式的字符串或只是一个字符串.例如,像下面的功能一样容易.

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

Wil*_*ing 38

对于其他任何寻求验证任何JSON字符串而不管架构的方法的人,请尝试以下方法:

func IsJSON(str string) bool {
    var js json.RawMessage
    return json.Unmarshal([]byte(str), &js) == nil
}
Run Code Online (Sandbox Code Playgroud)

  • 人民,这应该是最佳答案。当前接受的答案对于JSON数组`[{“ key”:“ value1”},{“ key”:“ value2”}]`失败。另外,另一种替代方法是:https://play.golang.org/p/0IfY696ubM (3认同)
  • 这应该是例外答案,不仅当前的例外答案在数组上​​失败,它还使用反射进行编组,并且要求的只是检查,导致例外答案占用两倍的时间! (2认同)
  • @srf 这是因为 JSON 允许对原始字符串和数字进行序列化,因此不需要将 JSON 包含在一组方括号或大括号中。JSON 字符串需要双引号括起来才有效。此函数还将返回 true 并使用普通整数/浮点数,因为它们也是有效的 JSON。请参阅此处的示例:https://play.golang.org/p/ev8kByJvx2Y (2认同)

Cor*_*Nou 22

我不清楚你是否需要知道一个"引用的字符串",或者你是否需要了解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))
    }

}
Run Code Online (Sandbox Code Playgroud)

哪个会输出这个:

isJSONString("Platypus") = true
isJSON("Platypus") = false

isJSONString(Platypus) = false
isJSON(Platypus) = false

isJSONString({"id":"1"}) = false
isJSON({"id":"1"}) = true
Run Code Online (Sandbox Code Playgroud)

  • 怎么样`[{"id":"1"}]`?这也是有效的JSON,但是你的脚本说它不是. (5认同)
  • 你的`isJSON`函数应该有`var js interface {}`以获得最大的通用性 (4认同)
  • 您应该使用`var js json.RawMessage`,因为这样消息不会被解组,因此它会更快并且会有更少的内存分配. (3认同)

val*_*ala 21

标准encoding/json库包含从 go 1.9 开始的json.Valid函数 - 请参阅https://github.com/golang/go/issues/18086。此函数可用于检查提供的字符串是否为有效的 json:

if json.Valid(input) {
    // input contains valid json
}
Run Code Online (Sandbox Code Playgroud)

json.Valid与第三方解决方案(例如fastjson.Validate )相比,速度可能相当慢,后者比标准快 5 倍json.Valid- 请参阅benchmarksjson validation部分。


pet*_*rSO 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`))
}
Run Code Online (Sandbox Code Playgroud)

输出:

true
false
Run Code Online (Sandbox Code Playgroud)

  • 怎么样`[{"id":"1"}]`?这也是有效的JSON,但是你的脚本说它不是. (2认同)