2013-02-12 1 views
1

Скажем, у меня есть сервис на основе REST, который возвращает объект JSON, как подКак применить регулярное выражение в поле JSON для извлечения определенных значений из него и сохранения в PostgreSQL Dataabse fron Mule Studio?

{ 
    "AlertDetails": 
     { 
      "start":0, 
      "left":0, 
      "_itemList": 
       [ 
        { 
         "id":"badntp", 
         "text":"The time cannot be synchronized to the configured time server.", 
         "click":{ 
            "text":"Click here to modify your time settings.", 
            "url":"datetime.html" 
           }, 
         "severity":"warning", 
         "occurred":"20121031T10:18:54", 
         "args":null 
        }, 
        { 
         "id":"updatesitefail", 
         "text":"The update site cannot be contacted to determine if software updates are available.", 
         "click":{ 
            "text":"Click here to manually check for updates.", 
            "url":"http:\\\/\\\/xyz.com\\\/support\\\/xyz.html" 
           }, 
         "severity":"info", 
         "occurred":"20121105T17:23:24", 
         "args":"[http:\\\/\\\/xyz.com\\\/support\\\/xyz.html]" 
        } 
       ] 
     } 
} 

Теперь у меня есть таблица в PostgreSQL (скажем TESTTABLE), структура которого как под

ID  (string) 
Severity (string) 
Occurred (string) 

Как можно Я разбираю эти значения из доступного поля JSON, чтобы вставить их в базу данных PostgreSQL из студии Mule ESB.

Окончательный результат в TESTTABLE должен быть

ID     Severity  Occured 
---------   ---------  -------- 
"badntp"   "warning"  "20121031T10:18:54" 
"updatesitefail" "info"   "20121105T17:23:24" 

Мой конфигурационный файл, как под

<jdbc:postgresql-data-source name="PostgreSQL_Data_Source" 
    user="username" password="pwd" url="jdbc:postgresql://localhost:5432/TestDB" 
    transactionIsolation="UNSPECIFIED" doc:name="PostgreSQL Data Source" /> 

<jdbc:connector name="PostgreSQL_Connector" dataSource-ref="PostgreSQL_Data_Source" 
    validateConnections="true" queryTimeout="-1" pollingFrequency="0" 
    doc:name="Database"> 
    <jdbc:query key="InsertRecord" 
     value="INSERT INTO &quot;testTable&quot;(&quot;ID&quot;,&quot;Severity&quot;,&quot;Occured&quot;) VALUES (?,?,?)" /> 
</jdbc:connector> 

<flow name="testRestFlow1" doc:name="testRestFlow1"> 
    <http:inbound-endpoint exchange-pattern="request-response" 
     address="http://localhost:8082/index.html" doc:name="HTTP" /> 
    <http:rest-service-component httpMethod="GET" 
     serviceUrl="http://localhost:35798/RestServiceImpl.svc/json/567" /> 
    <object-to-string-transformer /> 
    <jdbc:outbound-endpoint exchange-pattern="one-way" 
     queryKey="InsertRecord" queryTimeout="-1" connector-ref="PostgreSQL_Connector" 
     doc:name="Database" /> 
</flow> 

# [message.payload] будет содержать весь JSON строки. Что будет (регулярное выражение или что-то еще) в VALUES (?,?,?) для разбора #[message.payload]?

Заранее спасибо

ответ

0

От MEL cheatsheet:

MEL не имеет прямой поддержки JSON. Трансформатор json-to-object может превратить полезную нагрузку JSON в иерархию простых структур данных, которые легко анализируются с помощью MEL.

Поэтому используйте сначала преобразовать JSON в datastructures (карты, списки):

<json:json-to-object-transformer returnClass="java.lang.Object" /> 

Затем мы извлекаем _itemList массив:

<expression-transformer 
    expression='#[message.payload['AlertDetails']['_itemList']]" /> 

Затем разделить этот массив в отдельных сообщениях :

<collection-splitter /> 

F в следующих выражениях будут оцениваться требуемые значения, чтобы их можно было использовать в запросе вставки:

#[message.payload.id] 
#[message.payload.severity] 
#[message.payload.occurred] 
0

Вы не можете получить данные с помощью регулярного выражения, потому что язык JSON файлов не является регулярным (он является контекстно-свободной). Я рекомендую вам разобрать его (используйте для этого некоторую библиотеку), а затем пропустите его и прочитайте значения.

+0

Можете ли вы показать пример в среде мула? –

+0

Прошу прощения, я не читал его правильно, я думал, что это вопрос программирования. Можете ли вы написать программу в своей среде? Если нет, я, вероятно, должен удалить свой ответ. –

Смежные вопросы