2013-12-12 18 views
6

Próbuję przenieść dane starej bazy danych do naszej nowej aplikacji.Napisz JSON do pola za pomocą Talent Open Studio

W trakcie procesu muszę pobrać dane ze starej db, aby utworzyć JSON, który musi być przechowywany w polu w nowej bazie danych MySQL db.

Używam komponentów tWriteJSONField i tExtractJSONFields.

W tWriteJSONField moje drzewo XML wygląda następująco:

path 
|-- id [loop element] 
|-- name 
|-- description 

nb : Nie mogę znaleźć sposobu korzystania z właściwości loop element i . Nie rozumiem, jak to działa, a dokumentacja nie mówi o tym.

Składnik tWriteJSONField jest połączony z tExtractJSONFields w celu wydzielenia id z JSON. Muszę to wiedzieć, aby każdy rekord JSON musiał być połączony.

tExtractJSONFields konfiguracja: zapytanie XPath

"/path" 

tExtractJSONFields konfiguracja: Mapowanie

----------------------------------------------- 
| column  | XPath request | get nodes ? | 
----------------------------------------------- 
| idForm  | "id"   | false  | 
----------------------------------------------- 
| jsonStructure | "*"   | yes   | 
----------------------------------------------- 

Mój problem jest w jsonStructure wyjściu przez tExtractJSONField, mam tylko pierwsze dziecko mojego tagu głównego . W moim przypadku jsonStructure wygląda następująco:

{ 
    "id": "123" 
} 

Oczekiwany wynik to:

{ 
    "id": "123", 
    "name": "Test", 
    "description": "Test" 
} 

Jeśli oświadczam dziecko name przed id na przykład, będę się:

{ 
    "name": "Test" 
} 

mam próbował zmienić zapytanie XPath dla jsonStructure, ale nigdy nie otrzymam wszystkich pól.

Dlaczego?

To moje pierwsze pytanie dotyczące Talend, więc jeśli brakuje informacji, daj mi znać w komentarzach.

Dzięki za pomoc.

EDIT:

Dane z tMysqlInput do tWriteJSONField:

nb : Mój strumień zawiera więcej kolumn, ale pokazuję tylko te, które są używane do tworzenia JSON.

--------------------------------------------------------------------------------------- 
| IdForm | NomForm     | DescrForm          | 
--------------------------------------------------------------------------------------- 
| 1  | English training   | <p>This is a description of the training</p> | 
--------------------------------------------------------------------------------------- 
| 2  | French training   | <p>This contains HTML tags from a WYSIWYG</p> | 
--------------------------------------------------------------------------------------- 
| 3  | How to use the application | <p>Description</p>       | 
--------------------------------------------------------------------------------------- 

W tWriteJSONField kolumny są odwzorowywane JSON tak:

path 
|-- id [loop element] --> IdForm 
|-- name    --> NomForm 
|-- description  --> DescrForm 

tWriteJSONField wyjście nowy strumienia z tych samych kolumn jako wejście (chociaż to kolumny są puste w produkcji nawet jeśli zostały wypełnione danymi wejściowymi) i dodać nowy jsonStructure, który zawiera wygenerowany JSON.

Ten nowy strumień zostaje przechwycony przez tExtractJSONFields (konfiguracja tego komponentu jest dostępna w moim oryginalnym wpisie).

tExtractJSONFields wyjścia tego topnika:

-------------------------- 
| IdForm | jsonStructure | 
-------------------------- 
| 1  | { "id": "1" } | 
-------------------------- 
| 2  | { "id": "2" } | 
-------------------------- 
| 3  | { "id": "3" } | 
-------------------------- 

I można oczekiwać, że ten powrót:

-------------------------------------------------------------------------------------------- 
| IdForm | jsonStructure                 | 
-------------------------------------------------------------------------------------------- 
| 1  | { "id": "1", "name": "English training", "description": "<p>This is[...]</p>" } | 
-------------------------------------------------------------------------------------------- 
| 2  | { "id": "2", "name": "French training", "description": "<p>[...]</p>" }   | 
-------------------------------------------------------------------------------------------- 
| 3  | { "id": "3", "name": "How to use the [...]", "description": "<p>[...]</p>" } | 
-------------------------------------------------------------------------------------------- 

EDIT 2

użyć TOS 5.4.0.r110020 jeśli można Wsparcie.

+0

wow! Trudno odpowiedzieć bez testowania. Czy możesz podać próbkę swojego JSON i danych wejściowych? Z fałszywymi danymi, ofc. I bądź cierpliwy przez kilka godzin! ;) –

+0

Dzięki za pomoc. Zmodyfikowałem mój wpis, aby dodać więcej szczegółów. Mam nadzieję, że to wystarczające. – Elorfin

Odpowiedz

6

Twoje żądanie XPath dla kolumny JSONStructure jest nieprawidłowe. Po prostu usuń "*", a uzyskasz oczekiwany rezultat.

XPathQuery

Ponadto, jeśli nie trzeba we wpisie json węzeł główny, po prostu sprawdzić „Usuń węzeł główny” na tWriteJsonField i zmienić Loop kwerendę XPath na „/” w tExtractJSONFields

Remove Root Node on tExtractJSONFields

+1

Dzięki. Spędziłem dużo czasu na tym sh **. – Elorfin