使用Avro Schema验证Json文件

时间:2018-02-13 11:26:47

标签: json go avro

我正在尝试检查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(..)方法吗?

1 个答案:

答案 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:]