在 NiFi 中使用 ConvertRecord 将具有相同名称但类型不同的子元素 JSON 转换为 XML 时,一些行丢失
When convert JSON with same name child elements but different types to XML using ConvertRecord in NiFi, some lines were lost
我想在 NiFi 中使用 ConvertRecord 处理器将低于 json 的格式转换为 xml。具有组件“Stream”的架构包含包含 3 个项目的部分。它们之间的区别在于,在一种情况下,子组件“A”是对象,在下一种情况下,“A”是数组,在第三种情况下,“A”又是对象,但它们具有相同的名称“C”。我的问题是在结果中,最后一个“A”中丢失了 2 行:
“描述”:“Q型”,
“金额”:“12”
原始输入:
{"Stream":[{"C":{"A":{"Decode":"pay"}}},{"C":{"A":[{"Decode":"Tr","Amount":"12"},{"Decode":"To","Amount":"12"}]}},{"C":{"A":{"Decode":"Qualifications","Description":"TYPE Q","Amount":"12"}}}]}
格式化输入(放在这里方便查看):
{
"Stream": [
{
"C": {
"A": {
"Decode": "pay"
}
}
},
{
"C": {
"A": [
{
"Decode": "Tr",
"Amount": "12"
},
{
"Decode": "To",
"Amount": "12"
}
]
}
},
{
"C": {
"A": {
"Decode": "Qualifications",
"Description": "TYPE Q",
"Amount": "12"
}
}
}
]
}
从 NiFi ConvertRecord 转换后的 XML 输出(注意“Qualifications”下的 2 行丢失):
<?xml version="1.0" encoding="UTF-8"?>
<temp>
<Stream>
<C>
<A>
<Decode>pay</Decode>
</A>
</C>
</Stream>
<Stream>
<C>
<A>
<Decode>Tr</Decode>
<Amount>12</Amount>
</A>
<A>
<Decode>To</Decode>
<Amount>12</Amount>
</A>
</C>
</Stream>
<Stream>
<C>
<A>
<Decode>Qualifications</Decode>
</A>
</C>
</Stream>
</temp>
我的NiFi流文件只有一个GenerateFlowFile和一个ConvertRecord,如附图1。ConvertRecord处理器使用了一个JsonTreeReader和一个XmlRecordSetWriter控制器服务,如附图2。
The flowfile
The GenerateFlowFile configuration
The JsonTreeReader configuration
The XmlRecordSetWriter configuration
我的问题是,在不改变原始输入的情况下,我应该如何修复丢失的数据?是我需要更改的任何控制器配置,还是我错过了任何可以进行验证的处理器?我觉得是架构导致了问题。但是不知道在哪里修复架构。
谢谢!
似乎 JsonTreeWriter
从它遇到的第一个对象推断出架构,并且此后永远不会改变。 (自然地)如果顺序不重要或无法更改,则下面的方法有效,否则您应该使用 avro
模式。检查这个 sample 。当然你的模式会更复杂
没有显式 avro
架构,您必须在第一个对象中提供所有属性,如下所示。您可以考虑在原始 json 对象
中为 empty/null 属性使用 json null
{
"Stream": [
{
"C": {
"A": {
"Decode": "Qualifications",
"Description": "TYPE Q",
"Amount": "12"
}
}
},
{
"C": {
"A": [
{
"Decode": "Tr",
"Amount": "12"
},
{
"Decode": "To",
"Amount": "12"
}
]
}
},
{
"C": {
"A": {
"Decode": "pay"
}
}
}
]
}
另请注意,在此解决方案中,您可能需要 Suppress Null Values
on XMLRecordSetWriter
我想在 NiFi 中使用 ConvertRecord 处理器将低于 json 的格式转换为 xml。具有组件“Stream”的架构包含包含 3 个项目的部分。它们之间的区别在于,在一种情况下,子组件“A”是对象,在下一种情况下,“A”是数组,在第三种情况下,“A”又是对象,但它们具有相同的名称“C”。我的问题是在结果中,最后一个“A”中丢失了 2 行: “描述”:“Q型”, “金额”:“12”
原始输入:
{"Stream":[{"C":{"A":{"Decode":"pay"}}},{"C":{"A":[{"Decode":"Tr","Amount":"12"},{"Decode":"To","Amount":"12"}]}},{"C":{"A":{"Decode":"Qualifications","Description":"TYPE Q","Amount":"12"}}}]}
格式化输入(放在这里方便查看):
{
"Stream": [
{
"C": {
"A": {
"Decode": "pay"
}
}
},
{
"C": {
"A": [
{
"Decode": "Tr",
"Amount": "12"
},
{
"Decode": "To",
"Amount": "12"
}
]
}
},
{
"C": {
"A": {
"Decode": "Qualifications",
"Description": "TYPE Q",
"Amount": "12"
}
}
}
]
}
从 NiFi ConvertRecord 转换后的 XML 输出(注意“Qualifications”下的 2 行丢失):
<?xml version="1.0" encoding="UTF-8"?>
<temp>
<Stream>
<C>
<A>
<Decode>pay</Decode>
</A>
</C>
</Stream>
<Stream>
<C>
<A>
<Decode>Tr</Decode>
<Amount>12</Amount>
</A>
<A>
<Decode>To</Decode>
<Amount>12</Amount>
</A>
</C>
</Stream>
<Stream>
<C>
<A>
<Decode>Qualifications</Decode>
</A>
</C>
</Stream>
</temp>
我的NiFi流文件只有一个GenerateFlowFile和一个ConvertRecord,如附图1。ConvertRecord处理器使用了一个JsonTreeReader和一个XmlRecordSetWriter控制器服务,如附图2。
The flowfile
The GenerateFlowFile configuration
The JsonTreeReader configuration
The XmlRecordSetWriter configuration
我的问题是,在不改变原始输入的情况下,我应该如何修复丢失的数据?是我需要更改的任何控制器配置,还是我错过了任何可以进行验证的处理器?我觉得是架构导致了问题。但是不知道在哪里修复架构。
谢谢!
似乎 JsonTreeWriter
从它遇到的第一个对象推断出架构,并且此后永远不会改变。 (自然地)如果顺序不重要或无法更改,则下面的方法有效,否则您应该使用 avro
模式。检查这个 sample 。当然你的模式会更复杂
没有显式 avro
架构,您必须在第一个对象中提供所有属性,如下所示。您可以考虑在原始 json 对象
null
{
"Stream": [
{
"C": {
"A": {
"Decode": "Qualifications",
"Description": "TYPE Q",
"Amount": "12"
}
}
},
{
"C": {
"A": [
{
"Decode": "Tr",
"Amount": "12"
},
{
"Decode": "To",
"Amount": "12"
}
]
}
},
{
"C": {
"A": {
"Decode": "pay"
}
}
}
]
}
另请注意,在此解决方案中,您可能需要 Suppress Null Values
on XMLRecordSetWriter