【问题标题】:Validating Json file with Avro Schema使用 Avro Schema 验证 Json 文件
【发布时间】:2018-02-13 11:26:46
【问题描述】:

我正在尝试检查 Json 字符串是否与 Avro 模式匹配。我不关心数据的序列化,只是得到isValidJson=true/false 的布尔结果。 我会使用每个 golang 库。 我试图用这个 goavro lib 写一些东西,但它对我不起作用,可能是因为我是 golang 的新手。

所需的伪代码:

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(..) 方法吗?

【问题讨论】:

  • 什么不起作用?除了这甚至没有编译的事实之外?
  • @marc 是的,我知道,我是 golang 的新手。我正在尝试根据提供的架构验证 Json 字符串是否有效。知道如何做到这一点或与 go 一起使用哪个库以及如何使用?通过 Java 和 Python 很容易,但我找不到在 golang 中进行此验证的方法。我将修复方法来表示我想要实现的伪代码。
  • [docs]((godoc.org/github.com/linkedin/goavro) 中没有关于验证的内容,它要么解析要么不解析。使用 codec.NativeFromTextual 解析 json 字符串。
  • @marc 我尝试了该方法但无法使用它。如果 jsonString 在失败时解析或返回错误,那就太好了。这意味着err == nil 是一个成功的解析。根据我的输入,它对你有用吗?
  • 你的架构是无效的 json,所以你甚至不能构建一个编解码器。

标签: json go avro


【解决方案1】:

您的架构 json 无效,它缺少终止 },因此 goavro.NewCodec 返回错误。

那么你的 json 字符串肯定与 schema 不匹配,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:]

【讨论】:

  • 你是傀儡大师!有没有办法像我在我的问题中提到的那样传递一个常规的 Json 字符串,或者使用一个为我做这件事的内置转换器?
  • 不知道,你必须四处寻找。
  • 非常感谢,我会编写自己的解析器,如果它足够好我会在这里分享。
猜你喜欢
  • 2021-04-18
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2020-01-21
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多