有没有有效的方法来遍历avro模式?

时间:2019-07-14 23:00:52

标签: javascript reactjs schema avro

我希望能够遍历和访问avro模式的“名称”字段值,但是由于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 个答案:

答案 0 :(得分:0)

您正在执行的功能是:

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

您的函数正在获取密钥为value的任何name。这就是为什么同时返回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' ]

我希望这会有所帮助。