我正在尝试检查Json字符串是否与Avro架构匹配。我不关心数据的序列化,只是获得了isValidJson=true/false
的bool结果。
我会选择每个 golang 库。
我试图用这个goavro库写一些东西,但它对我不起作用,也许是因为我是新手。
所需的伪代码:
func main() {
avroSchema :=
`{"type":"record","name":"raw","namespace":"events","fields":[{"name":"my_int","type":["null","int"],"default":null},{"name":"my_string","type":["null","string"],"default":"null"},{"name":"my_string2","type":null}]}`
jsonString := `{"my_int": 3, "my_string": "foo", "my_string2": null}`
ok ;= isValidJson(jsonString, avroSchema)
}
知道如何实现isValidJson(..)
方法吗?
答案 0 :(得分:1)
您的架构json无效,它错过了终止}
,因此goavro.NewCodec
会返回错误。
然后你的json字符串肯定与模式不匹配,json值必须是{type: value}
。
您可以使用以下更正的架构和示例字符串来验证它。
func main() {
avroSchema := `
{
"type":"record",
"name":"raw",
"namespace":"events",
"fields":[
{
"name":"my_int",
"type":[
"null",
"int"
],
"default":null
},
{
"name":"my_string",
"type":[
"null",
"string"
],
"default":null
},
{
"name":"my_string2",
"type":"null"
}
]
}`
codec, err := goavro.NewCodec(avroSchema)
if err != nil {
log.Fatalf("Codec error: %v", err)
}
jsonString := `{"my_int": {"int":3}, "my_string": {"string":"foo"}, "my_string2": null}`
decoded, _, err := codec.NativeFromTextual([]byte(jsonString))
if err != nil {
log.Fatalf("NativeFromTextual error: %v", err)
}
log.Println("Decoded:", decoded)
}
打印:
解码:map [my_int:map [int:3] my_string:map [string:foo] my_string2:]