我已将国家/地区加入OracleXE中的HR示例数据库中的位置。
然后我使用tMap生成嵌套的JSON文档。
它可以工作,但由于某种原因,位置中的空值将作为控制台最终输出中的数组(也尝试过MongoDB)。
答案 0 :(得分:1)
感谢https://www.talendforge.org/forum/viewtopic.php?id=27791
在tWriteJsonField之后插入带有以下代码的 tJavaRow :
output_row.output = input_row.output.replaceAll(",?\"[a-zA-Z_0-9]*\":\\[\\]", "");
答案 1 :(得分:1)
我相信,简洁(简短)的解决方案如下。
Talend docs指出:
在配置JSON树时,元素的默认类型为 串。如果元素不是字符串类型,则需要添加一个 属性以设置其类型。
因此,对于接收空值的对象,您应该添加一个名为 class 的属性,并将其静态值设置为 object 。
瞧瞧!
答案 2 :(得分:0)
因为tWriteJSONField生成一个xml,然后使用json-lib将其转换为JSON。您的空值将转换为空的xml节点<STATE_PROVINCE/>
,并且没有此节点的上下文的json-lib将假定它是没有子节点的父节点,而不是空文本(null概念已经是远在这一点上。)
以下是简短的事情:
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,搜索"\"@"
,替换为"\""
,取消选中整个单词,检查全局表达式。如果为null,您的最终JSON将没有属性。