是否有一种有效的方法来遍历 avro 模式?

Is there an efficient way to iterate through an avro schema?

我希望能够遍历并访问 avro 模式的 'name' 字段值,但是由于特定的方式,我无法找到一种有效的方法,而不会获得额外的值avro 需要它的模式数据。

我可以递归遍历它,就好像它是一个js对象一样;但是,我最终得到了某些我不想包含在结果中的字段。

例如,在下面的代码中,我想要返回的唯一值是 'foobar' 但是我也得到 'Foo' 我不想要的,因为那是对象数组的名称而不是单个值。

{
          "type": "record",
          "name": "Foo",
          "fields": [
            {
              "name": "foobar",
              "type": "string"
            }
          ]
}

我使用的当前函数如下所示:

  iterateAvro = (target) => {
    let result = [];
    Object.entries(target).forEach(([key, val]) => {
        if (val === null){
          return null
        }
        if (typeof val === 'object'){
          result = result.concat(this.iterateAvro(val));
        } else {
          if(key === 'name'){
            result.push(val) 
          }
        }
    })
    return result
  }

我是 avro(和一般编码)的新手,不知道是否有特定于 avro 的方法来执行此操作。任何帮助将不胜感激。

你在你的函数中所做的是:

  1. 将 JavaScript 对象转换为 key/value 对数组。
  2. 迭代对和: 一种。如果 valuenull 什么也不做。 b.如果 value 是一个对象,则使用递归将此逻辑应用于它。 C。如果 keyname 将值推送到通过 Clojure.
  3. 访问的名为 result 的数组

您的函数正在抓取键为 name 的任何 value。这就是返回 foobarFoo 的原因。

查看 Apache Avro's documentation 我看到在 fields 键内,有一个包含多个 field 对象的列表,每个对象都必须有一个 name 键。

因此,假设您想获得所有 field names 的值,您可以这样做:

// JSON object gotten directly from Apache Avro's documentation.
var avroRecord = {
  "type": "record",
  "name": "LongList",
  "aliases": ["LinkedLongs"],                      // old name for this
  "fields" : [
    {"name": "value", "type": "long"},             // each element has a long
    {"name": "next", "type": ["null", "LongList"]} // optional next element
  ]
}

function getFieldsNames(record) {
  return avroRecord.fields.map((field) => {
    return field.name;
  });
}

console.log(getFieldsNames(avroRecord))
// [ 'value', 'next' ]

希望对您有所帮助。