Чтение json Payload как части файла CSV в dataweave - PullRequest
0 голосов
/ 06 июня 2019

У меня есть веб-сервис, который экспортирует файл CSV, в котором один из столбцов содержит полезную нагрузку JSON.После выполнения веб-службы я сохраняю значения в локальной переменной для преобразования.Каждый раз, когда я читаю значения из этого столбца, я пропускаю значения, и возвращается только «}».Не уверен, почему это происходит.Я хочу сохранить полезную нагрузку JSON как есть и сохранить ее в файле после некоторой обработки.Пожалуйста, сообщите

Я использую код ниже, чтобы получить значение столбца атрибута, и он всегда возвращает "}".Остальное содержимое игнорируется

CSV Fragment
-------------
 id,name,attributes
 1,name1,{"Choice Number":"0","Campaign Run Id":"234"}
 2,name2,{"Choice Number":"1","Campaign Run Id":"235"}
 3,name3,{"Choice Number":"2","Campaign Run Id":"236"}
 4,name4,{"Choice Number":"3","Campaign Run Id":"236"}


Code
----
 %dw 1.0
 %output application/java
 ---
 flowVars.activityData map ((actData) -> {
      "playerId": actData.id,
      "name": actData.name,
      "attributes": actData.attributes
  })

Я ожидал, что будет возвращена полная полезная нагрузка JSON из столбца атрибутов, а это не так.Одна вещь, которую я здесь заметил, заключается в том, что во входных данных JSON отсутствует экранирование символов.Но я тоже не могу это контролировать.Как извлечь информацию из столбца атрибута в этом случае


Поскольку я не могу поделиться всем проектом, создал пример проекта и используя входные данные из @machaval с объектом http, получающим файл csv.Помеченный mimetype как text / csv и отправка полезной нагрузки

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd">
    <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
    <flow name="CSVFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/process" doc:name="HTTP"/>
        <object-to-string-transformer doc:name="Object to String"/>
        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
//First remove the header
(payload splitBy "\n")[1 to -1] 
    map ((item, index) -> using(commas = item find ",")             
        {
            id: item[0 to commas[0] - 1],
            name: item[commas[0] + 1 to commas[1] - 1],
            attributes: item[commas[1] + 1 to -1]
        }
    )]]></dw:set-payload>
        </dw:transform-message>
    </flow>

</mule>

1 Ответ

0 голосов
/ 06 июня 2019

Привет, Раджеев, проблема с твоими данными в том, что это не CSV, json нужно каким-то образом экранировать.Таким образом, я решил вашу проблему, обработав ваш ввод как строку (это можно легко сделать, используя объект в строку mp) и проанализировав его вручную.Я предполагаю, что в вашем формате больше нет хитростей.

%dw 1.0
output application/json  
---
//First remove the header
(payload splitBy "\n")[1 to -1] 
    map ((item, index) -> using(commas = item find ",")             
        {
            id: item[0 to commas[0] - 1],
            name: item[commas[0] + 1 to commas[1] - 1],
            attributes: item[commas[1] + 1 to -1]
        }
    )
...