我希望能够遍历和访问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特定的方法来执行此操作。任何帮助将不胜感激。
答案 0 :(得分:0)
您正在执行的功能是:
value
为null
,则什么也不做。
b。如果value
是一个对象,请使用递归对其应用此逻辑。
C。如果key
为name
,则将值推送到通过result
访问的名为Clojure
的数组。您的函数正在获取密钥为value
的任何name
。这就是为什么同时返回foobar
和Foo
的原因。
看着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' ]
我希望这会有所帮助。