使用Talend Open Studio将JSON写入字段

时间:2013-12-12 09:04:29

标签: json talend

我尝试将旧数据库的数据迁移到我们的新应用程序中。

在进程中,我需要从旧数据库中获取数据以创建一个必须存储在新MySQL数据库中的字段中的JSON。

所以我使用了组件tWriteJSONFieldtExtractJSONFields

tWriteJSONField中,我的XML树看起来像这样:

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

N.B。 :我找不到如何使用loop elementgroup element属性。我不明白它是如何工作的,文档也没有谈到这个。

组件tWriteJSONField已链接到tExtractJSONFields,以便从JSON中提取id。我需要知道每个记录JSON必须链接。

tExtractJSONFields配置: XPath请求

"/path"

tExtractJSONFields配置:映射

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

我的问题是jsonStructure输出tExtractJSONField,我只得到了我的root标签的第一个孩子。在我的情况下,jsonStructure看起来像这样:

{
   "id": "123"
}

预期结果是:

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

例如,如果我在name之前声明孩子id,我会得到:

{
   "name": "Test"
}

我曾尝试更改jsonStructure的XPath查询,但我从未获得所有字段。

为什么?

这是我关于Talend的第一个问题,所以如果它缺少信息,请在评论中告诉我。

感谢您的帮助。

编辑:

tMysqlInputtWriteJSONField的数据:

N.B。 :My flux包含更多列,但我只显示用于创建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>                            |
---------------------------------------------------------------------------------------

tWriteJSONField中,列映射到JSON,如下所示:

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

tWriteJSONField输出一个与输入相同列的新通量(尽管这些列在输出中都是空的,即使它们已在输入中填充)并添加一个新的jsonStructure包含生成JSON。

这个新的通量由tExtractJSONFields捕获(此组件的配置可在我的原始帖子中找到)。

tExtractJSONFields输出此通量:

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

我希望它能归还这一个:

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

编辑2

如果可以提供帮助,我会使用TOS 5.4.0.r110020。

1 个答案:

答案 0 :(得分:6)

您对JSONStructure列的XPath请求不正确。只需删除“*”即可获得预期结果。

XPathQuery

此外,如果您不需要json条目中的根节点,只需检查tWriteJsonField上的“删除根节点”,并在tExtractJSONFields中将Loop XPath Query更改为“/”

Remove Root Node on tExtractJSONFields