为什么tWriteJSONField为空值创建数组?

时间:2017-02-16 23:15:32

标签: json mongodb talend

我已将国家/地区加入OracleXE中的HR示例数据库中的位置。

然后我使用tMap生成嵌套的JSON文档。

enter image description here

它可以工作,但由于某种原因,位置中的空值将作为控制台最终输出中的数组(也尝试过MongoDB)。

enter image description here

3 个答案:

答案 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

Pic: JSON Tree Configuration

瞧瞧!

PIC: "Complemento":null

答案 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将没有属性。