2016-07-08 40 views
1

我是Talend的新人,並向更有經驗的人尋求幫助。解析JSON到MongoDB inTalend

我想從Web服務RESTFul下載數據到MongoDB數據庫,但收到的原始JSON格式不允許在表中直接插入所需的,我需要轉換此JSON才能進入集合,所以通過MongoDB我可以通過CODE和NAME鍵進行搜索。

我訪問了一些關於此主題的文章(JSON parser for Talend,tRest and map JSON with tExtractJSONField with TALEND,How to Parse Json in Talend using tExtractJsonField),但我無法讓它工作。我試圖使用tFileInputJSON,tMap,tExtractJSONFields,但沒有成功。

一個我需要的JSON的,我得到的格式如下:

[ 
{"CODIGO":"907","NOME_COMPLETO":"Ag\u00eancia do IBGE em Ceres"}, 
{"CODIGO":"905","NOME_COMPLETO":"Ag\u00eancia do IBGE em Goi\u00e1s"}, 
{"CODIGO":"910","NOME_COMPLETO":"Ag\u00eancia do IBGE em Ipor\u00e1"}, 
{"CODIGO":"919","NOME_COMPLETO":"Ag\u00eancia do IBGE em Itumbiara"}, 
{"CODIGO":"911","NOME_COMPLETO":"Ag\u00eancia do IBGE em Jaragu\u00e1"}, 
] 

我不知道是否因爲「[」和「]」出現在文件的開頭和結尾,Talend組件不允許您查看文件架構。例如,獲得此JSON由TREST,它把這種格式:

{"data":[ 
    {"Body":"[ 
     {\"CODIGO\":\"907\",\"NOME_COMPLETO\":\"Ag\\u00eancia do IBGE em Ceres\"}, 
     {\"CODIGO\":\"905\",\"NOME_COMPLETO\":\"Ag\\u00eancia do IBGE em Goi\\u00e1s\"}, 
     {\"CODIGO\":\"910\",\"NOME_COMPLETO\":\"Ag\\u00eancia do IBGE em Ipor\\u00e1\"}, 
     {\"CODIGO\":\"919\",\"NOME_COMPLETO\":\"Ag\\u00eancia do IBGE em Itumbiara\"}, 
     {\"CODIGO\":\"911\",\"NOME_COMPLETO\":\"Ag\\u00eancia do IBGE em Jaragu\\u00e1\"} 
    ]", 
"ERROR_CODE":null 
} 
] 

}

因此,tExtractJSONFields只承認「身體」的標籤,而不能獲得「CODIGO」標籤,更不用說組件添加的雙引號。

當我插入MongoDB中該內容(使用tMongoDBOutput),它創造了一個獨特的記錄,並且不會允許我CODIGO進行搜索,例如

我該怎麼做纔能有機會獲得標籤CODIGO和NOME_COMPLETO?

+0

您可能需要使用'.loads()從[json](https://docs.python.org/2.7/library/json.html)返回的數據將數據轉換爲實際的python對象,然後再將它們傳遞給inTalend –

+0

感謝您的快速回報。問題:我不使用python,而是使用java。無論如何,你在這個解決方案的工作中使用什麼樣的組件? –

回答

1

首先,讓我推薦http://jsonpath.com,我總是用它來檢查我的JSON路徑查詢的正確性。

添加另一個tExtractJSONFields之後你用來提取Body標籤。然後你可以提取字段CODIGONOME_COMPLETO。另外,JSON的路徑循環查詢"$.[*]"(我試過在上述網頁)在tFileInputJSON也許還可以做你想做什麼:

tFileInputJSON properties

+0

感謝JSONPath的提示! –

+1

您的建議幫助我獲得了理想的解決方案。我在循環Jsonpath查詢中輸入「$ [*]」,並將Json查詢定義爲「$ .CODIGO」和「$ .NOME_COMPLETO」。我在tExtractJSONFields上直接對tMongoDBOutput使用了tRest。 –