我在OracleXE的HR Sample数据库中已将国家/地区加入到位置。为什么tWriteJSONField为空值创建一个数组?
然后我使用tMap生成嵌套的JSON文档。
它的工作原理,但在位置某种原因空值来作为通过在阵列控制台中的最终输出(也尝试过的MongoDB)。
我在OracleXE的HR Sample数据库中已将国家/地区加入到位置。为什么tWriteJSONField为空值创建一个数组?
然后我使用tMap生成嵌套的JSON文档。
它的工作原理,但在位置某种原因空值来作为通过在阵列控制台中的最终输出(也尝试过的MongoDB)。
因为tWriteJSONField生成XML,那么它使用JSON-lib的变换为JSON。你的空值将被转换为一个空的xml节点<STATE_PROVINCE/>
,并且没有这个节点的上下文的json-lib将假定它是一个没有子节点的父节点,而不是一个空文本(在这一点上空的概念已经很远了)。
这里是短会发生什么:
package test.json;
public class JSONTest {
public static void main(String[] args) {
net.sf.json.xml.XMLSerializer s = new net.sf.json.xml.XMLSerializer();
s.clearNamespaces();
s.setSkipNamespaces(true);
s.setForceTopLevelObject(true);
net.sf.json.JSON json = s.read("<?xml version=\"1.0\" encoding=\"ISO-8859-15\"?>" +
"<org>" +
"<STATE_PROVINCE/>" +
"</org>"
);
System.out.println(json.toString());
}
}
结果:
{"org":{"STATE_PROVINCE":[]}}
一个肮脏的解决方案是在你的tWriteJSONField使用属性,而不是节点,但它会与@前缀的属性。所以在这个组件之后你把一个tReplace,搜索"\"@"
,用"\""
替换,取消全选单词,检查全局表达式。如果为空,您的最终JSON将没有属性。
由于https://www.talendforge.org/forum/viewtopic.php?id=27791
插入tJavaRow用下面的代码你tWriteJsonField之后:
优秀......非常感谢 – smackenzie
或者,因为拓蓝是脑死亡。我了解技术原因:但是没有合理的软件包可以设计出这种行为。我已经看到这是“预期”行为的解释。在我们的工作中,我们有这些小小的搜索和替换java片段。 – fool4jesus