在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

输出如下:

here

即使样本数据无效,我也是如此。这是怎么了如何通过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