2016-01-07 49 views
0

我得到了xml输出,然后我将该xml转换为json对象。格式如下。如何在mulesoft中从json中提取JSON数组

{ 
"SOAP-ENV:Envelope": { 
    "@xmlns:SOAP-ENV": "http://schemas.xmlsoap.org/soap/envelope/", 
    "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", 
    "@xmlns:xsd": "http://www.w3.org/2001/XMLSchema", 
    "SOAP-ENV:Body": { 
     "rpc:TestExampleResponse": { 
      "@xmlns:rpc": "http://Test.com/asi/", 
      "TestMessage": { 
       "listOfTESTS": { 
        "@xmlns:xmlns": "http://www.Test.com/xml/TEST", 
        "TESTS": [{ 
          "id": "1", 
          "lastSyncDate": "12/16/2015 07:06:38", 
          "listOfTESTsyncrealtimeChild": null 
         }, { 
          "id": "2", 
          "lastSyncDate": "12/16/2015 07:06:38", 
          "listOfTESTsyncrealtimeChild": null 
         } 

        ] 
       } 
      } 
     } 
    } 
} 
} 

我想从JSON输出提取试验阵列Mulesoft.I不知道如何提取mulesoft.Thanks该数组提前

+0

我已经试过的Xpath但得到以下错误执行表达式“xpath3('/ SOAP-ENV:Envelope',有效载荷,'STRING')”失败。 (org.mule.api.expression.ExpressionRuntimeException)。消息有效负载的类型为:字符串 –

+0

由于当前的有效内容不是XML,因此无法使用XPATH。你可以找到[我的答案](http://stackoverflow.com/questions/34647518/how-to-extract-json-array-from-json-in-mulesoft/34649584#34649584)有用 –

回答

-2

你可以写一个自定义的变压器像下面。该变压器使用Jackson (com.fasterxml.jackson)依赖关系。

变换器返回一个字符串列表,其中每个字符串表示您的TESTS数组的元素。

public class JsonArrayExtractor extends AbstractTransformer { 

    private final ObjectMapper mapper = new ObjectMapper(); 
    private final String testsNodeJsonPointer = "/SOAP-ENV:Envelope/SOAP-ENV:Body/rpc:TestExampleResponse/TestMessage/listOfTESTS/TESTS"; 

    public JsonArrayExtractor() { 
     registerSourceType(DataTypeFactory.STRING); 
    } 

    @Override 
    protected Object doTransform(Object src, String enc) throws TransformerException { 
     String payload = Objects.toString(src); 

     JsonNode root; 
     try { 
      root = mapper.readTree(payload); 
     } catch (IOException e) { 
      throw new TransformerException(this, e); 
     } 

     List<String> testsList = new ArrayList<>(); 

     JsonNode testsNode = root.at(JsonPointer.valueOf(testsNodeJsonPointer)); 
     if (testsNode instanceof ArrayNode) { 
      ArrayNode testsArrayNode = (ArrayNode) testsNode; 
      for (JsonNode test : testsArrayNode) { 
       testsList.add(test.toString()); 
      } 
     } 
     return testsList; 
    } 
} 

您可以在您的流程中使用上述变压器,如下所示。

<custom-transformer class="org.ram.JsonArrayExtractor" doc:name="extractTestsArray"/> 
0

您可以使用Dataweave(变换在Anypoint工作室消息组件)

(骡子EE)

看看是否与文档

https://docs.mulesoft.com/mule-user-guide/v/3.7/using-dataweave-in-studio

您的输入

示例脚本:

%dw 1.0 
%input payload application/json 
%output application/json 
--- 
TESTS: payload."SOAP-ENV:Envelope"."SOAP-ENV:Body"."rpc:TestExampleResponse".TestMessage.listOfTESTS.TESTS map ((tEST , indexOfTEST) -> { 
     id: tEST.id, 
     lastSyncDate: tEST.lastSyncDate, 
     listOfTESTsyncrealtimeChild: tEST.listOfTESTsyncrealtimeChild 
}) 

输出使用%output application/json时:

{ 
    "TESTS": [ 
    { 
     "id": "1", 
     "lastSyncDate": "12/16/2015 07:06:38", 
     "listOfTESTsyncrealtimeChild": null 
    }, 
    { 
     "id": "2", 
     "lastSyncDate": "12/16/2015 07:06:38", 
     "listOfTESTsyncrealtimeChild": null 
    } 
    ] 
} 

输出使用%output application/java时:

{TESTS=[{id=1, lastSyncDate=12/16/2015 07:06:38, listOfTESTsyncrealtimeChild=null}, {id=2, lastSyncDate=12/16/2015 07:06:38, listOfTESTsyncrealtimeChild=null}]}