Поскольку tWriteJSONField генерирует XML, а затем преобразует его в JSON с помощью JSON-Lib. Ваше нулевое значение будет преобразовано в пустой узел 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 не будет иметь свойства, если null.
Отлично ... большое спасибо – smackenzie
Или, потому что Talend является мозг мертв. Я понимаю техническую причину: но никакой разумный пакет программного обеспечения не был бы разработан с таким поведением. Я видел объяснения, что это «ожидаемое» поведение. У нас есть эти небольшие поиски и замена фрагментов java на всех наших рабочих местах. – fool4jesus