2013-12-12 13 views
6

古いデータベースのデータを新しいアプリケーションに移行しようとしています。Talend Open Studioを使用してJSONをフィールドに書き込む

処理中に、新しいDBのフィールドに格納する必要があるJSONを作成するために、古いdbのデータを取得する必要があります。

したがって、私はコンポーネントtWriteJSONFieldtExtractJSONFieldsを使用します。 tWriteJSONField

、私のXMLツリーは次のようになります。

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

N.B. :loop elementgroup elementプロパティを使用する方法が見つかりません。私はそれがどのように動作するのか分からず、ドキュメンテーションはこれについて話しません。

tWriteJSONFieldは、JSONからidを抽出するためにtExtractJSONFieldsにリンクされています。 JSONをリンクする必要がある各レコードを知るためには、これが必要です。

tExtractJSONFields設定:XPathの要求

"/path" 

tExtractJSONFields設定:マッピング

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

私の問題は、tExtractJSONFieldによってjsonStructure出力であり、私は私のルートタグの最初の子を取得します。私の場合はjsonStructureは、次のようになります。

{ 
    "id": "123" 
} 

期待される結果は次のとおりです。

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

私は例えばid前に、子nameを宣言すると、私はなります:私は持っている

{ 
    "name": "Test" 
} 

jsonStructureのXPathクエリを変更しようとしましたが、すべてのフィールドを取得することはありません。

なぜですか?

Talendについての私の最初の質問です。情報が不足している場合は、コメントにお知らせください。

ありがとうございました。

EDIT:tMysqlInputtWriteJSONFieldから

データ:

N.B. :私のフラックスにはより多くの列が含まれていますが、JSONの作成に使用されているものだけを表示します。tWriteJSONField

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

は、列は次のようにJSONにマッピングされる。

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

tWriteJSONField出力入力と同じ列を持つ新しいフラックス(この列は、すべての出力に空であるがそれらが入力に入力されたとしても)生成されたJSONを含む新しい1つをjsonStructureに追加します。

この新しい磁束はtExtractJSONFieldsで捕捉されます(このコンポーネントの構成は、私のオリジナルポストで入手できます)。

tExtractJSONFields出力する。このフラックス:

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

そして、私はそれを期待しては返すこの1:

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

それができるならば、私はTOS 5.4.0.r110020使用助けて。

+0

うわー!それはテストなしでは答えにくいです。 JSONと入力データのサンプルを提供できますか?偽のデータでは、そして、2時間ほど待ってください! ;) –

+0

助けてくれてありがとう。私は詳細を追加するために投稿を編集しました。それが十分であることを願っています。 – Elorfin

答えて

6

JSONStructure列のXPathリクエストが正しくありません。単に "*"を削除すると、期待した結果が得られます。

XPathQuery

あなたはJSONのエントリのルートノードを必要としない場合にも、ちょうどチェックを「/」tWriteJsonFieldの「ルート・ノードを削除する」とループのXPathクエリを変更tExtractJSONFields

Remove Root Node on tExtractJSONFields

+1

ありがとうございます。私はこのsh **で多くの時間を過ごしました。 – Elorfin

関連する問題