получить JSON-ответ от API и сопоставить его с POJO-классом, используя Mule - PullRequest
0 голосов
/ 19 декабря 2018

Мне нужно получить JSONArray из URL и преобразовать полученные данные в файл .csv.Я довольно новичок в Java и Mule.Мы используем Community Mule, поэтому компонент преобразования сообщения здесь не подходит.

Я создал POJO-класс "JsonData" со всеми геттерами и сеттерами, и я понял, что использование этого POJO-класса в качестве класса возврата JSON-to-Object -transformer в Mule будет соответствовать JSONИмена свойств для тех в этом POJO-классе.

Вот мои данные JSON:

[
{
    "accountId": "064418ca1d292a5112e9804af4dc66df5b90203c",
    "iban": "FI2350009421535899",
    "bic": "OKOYFIHH",
    "accountName": "KÄYTTÖTILI",
    "balance": 0,
    "amountAvailable": 0,
    "currency": "EUR"
},
{
    "accountId": "07618ad83d7c5d5f2db8908d33b6a9272c5e8d96",
    "iban": "FI7858400761900714",
    "bic": "OKOYFIHH",
    "accountName": "KASVUTUOTTO",
    "balance": 3137.57,
    "amountAvailable": 3137.57,
    "currency": "EUR"
}
]

А вот мой POJO-класс, сгенерированный jsonschema2pojo.org -tool:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"accountId",
"iban",
"bic",
"accountName",
"balance",
"amountAvailable",
"currency"
})

public class JsonData {


@JsonProperty("accountId")
private String accountId;
@JsonProperty("iban")
private String iban;
@JsonProperty("bic")
private String bic;
@JsonProperty("accountName")
private String accountName;
@JsonProperty("balance")
private Double balance;
@JsonProperty("amountAvailable")
private Double amountAvailable;
@JsonProperty("currency")
private String currency;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("accountId")
public String getAccountId() {
return accountId;
}

@JsonProperty("accountId")
public void setAccountId(String accountId) {
this.accountId = accountId;
}

@JsonProperty("iban")
public String getIban() {
return iban;
}

@JsonProperty("iban")
public void setIban(String iban) {
this.iban = iban;
}

@JsonProperty("bic")
public String getBic() {
return bic;
}

@JsonProperty("bic")
public void setBic(String bic) {
this.bic = bic;
}

@JsonProperty("accountName")
public String getAccountName() {
return accountName;
}

@JsonProperty("accountName")
public void setAccountName(String accountName) {
this.accountName = accountName;
}

@JsonProperty("balance")
public Double getBalance() {
return balance;
}

@JsonProperty("balance")
public void setBalance(Double balance) {
this.balance = balance;
}

@JsonProperty("amountAvailable")
public Double getAmountAvailable() {
return amountAvailable;
}

@JsonProperty("amountAvailable")
public void setAmountAvailable(Double amountAvailable) {
this.amountAvailable = amountAvailable;
}

@JsonProperty("currency")
public String getCurrency() {
return currency;
}

@JsonProperty("currency")
public void setCurrency(String currency) {
this.currency = currency;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}

У меня также естьМул поток с GET-запросом, Json-To-Object -transformer, Object-To-String -transformer, logger-component и File-endpoint, который записывает журнал или полезную нагрузку в новый текстовый файл.Проблема в том, что когда я запускаю поток Mule, полезная нагрузка не та, какой должна быть ... ниже - мой поток Mule:

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

<mule xmlns:file="http://www.mulesoft.org/schema/mule/file" 
xmlns:json="http://www.mulesoft.org/schema/mule/json" 
xmlns:http="http://www.mulesoft.org/schema/mule/http" 
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/http 
http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/json 
http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
http://www.mulesoft.org/schema/mule/file 
http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd">
<http:request-config name="HTTP_Request_Configuration" protocol="HTTPS" 
host="sandbox.apis.op-palvelut.fi" port="443" doc:name="HTTP Request 
Configuration"/>
<file:connector name="CreateFile" autoDelete="true" streaming="true" 
validateConnections="true" doc:name="File"/>
<file:endpoint path="${juuri.csv}" name="CreateCSV" responseTimeout="10000" 
doc:name="File"/>
<file:endpoint path="${juuri.log}" name="CreateLog" responseTimeout="10000" 
doc:name="File"/>
<flow name="myynnittonovaFlow">
    <poll doc:name="Poll">
        <fixed-frequency-scheduler frequency="5" timeUnit="SECONDS"/>
        <logger message="Started....." level="INFO" doc:name="Logger"/>
    </poll>
    <http:request config-ref="HTTP_Request_Configuration" path="v1/accounts" 
method="GET" doc:name="HTTP">
        <http:request-builder>
            <http:header headerName="x-authorization" value="${auth}"/>
            <http:header headerName="x-api-key" value="${api_key}"/>
        </http:request-builder>
    </http:request>
    <json:json-to-object-transformer 
returnClass="json.csv.testing.JsonData[]" doc:name="JSON to Object"/>
    <object-to-string-transformer doc:name="Object to String"/>
    <logger message="#[payload]" level="INFO" doc:name="Logger"/>
    <file:outbound-endpoint outputPattern="log.txt" connector- 
ref="CreateFile" ref="CreateLog"  responseTimeout="10000" 
doc:name="CreateLog"/>
  </flow>
</mule>

И полезная нагрузка, которую я получаю от этого:

{json.csv.testing.JsonData@22fddfa0,json.csv.testing.JsonData@34ff4054}

Итак, я что-то здесь упускаю или в чем может быть проблема?Я надеюсь, что я объяснил это правильно ...

ОБНОВЛЕНИЕ:

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

Вот мой модифицированный POJO-класс:

public class JsonData {


@JsonProperty("accountId")
private String accountId;
@JsonProperty("iban")
private String iban;
@JsonProperty("bic")
private String bic;
@JsonProperty("accountName")
private String accountName;
@JsonProperty("balance")
private Double balance;
@JsonProperty("amountAvailable")
private Double amountAvailable;
@JsonProperty("currency")
private String currency;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, 
Object>();

@JsonProperty("accountId")
public String getAccountId() {
return accountId;
}

@JsonProperty("accountId")
public void setAccountId(String accountId) {
this.accountId = accountId;
}

@JsonProperty("iban")
public String getIban() {
return iban;
}

@JsonProperty("iban")
public void setIban(String iban) {
this.iban = iban;
}

@JsonProperty("bic")
public String getBic() {
return bic;
}

@JsonProperty("bic")
public void setBic(String bic) {
this.bic = bic;
}

@JsonProperty("accountName")
public String getAccountName() {
return accountName;
}

@JsonProperty("accountName")
public void setAccountName(String accountName) {
this.accountName = accountName;
}

@JsonProperty("balance")
public Double getBalance() {
return balance;
}

@JsonProperty("balance")
public void setBalance(Double balance) {
this.balance = balance;
}

@JsonProperty("amountAvailable")
public Double getAmountAvailable() {
return amountAvailable;
}

@JsonProperty("amountAvailable")
public void setAmountAvailable(Double amountAvailable) {
this.amountAvailable = amountAvailable;
}

@JsonProperty("currency")
public String getCurrency() {
return currency;
}

@JsonProperty("currency")
public void setCurrency(String currency) {
this.currency = currency;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

@Override
public String toString() {

  return "accountId: " +  getAccountId() + " iban: " + getIban() + " bic: " 
+ getBic() + " accountName: " + getAccountName() + " balance: " + 
getBalance() 
+ " amountAvailable: " + getAmountAvailable() + " currency: " + 
getCurrency() + "\r\n"; 
}
}

А вот класс, который должен делатьпреобразование в CSV ....

public class DataToCSV {
public static final String HEADER = 
"CODE;IBAN;BIC;NAME;BALANCE;AMOUNTAVAILABLE;CURRENCY";

public static String doCSV(Vector<JsonData> json) throws Exception {
    String str = new String();
    Map<String, String> values = new HashMap<String, String>();
    Gson gson = new Gson();
    JsonData[] data = gson.fromJson(json.toString(), JsonData[].class);

    for (int i = 0; i < data.length; i++) {
        try {
       values.clear();
       values.put("CODE", data[i].getAccountId());
       values.put("IBAN", data[i].getIban());
       values.put("BIC", data[i].getBic());
       values.put("NAME", data[i].getAccountName());
       values.put("BALANCE", Double.toString(data[i].getBalance()));   
values.put("AMOUNTAVAILABLE",Double.toString(data[i].getAmountAvailable()));
       values.put("CURRENCY", data[i].getCurrency());
       str=str.concat(NovaUtils.doNovaLine(values,HEADER.split(";")));

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    if (str != null && !str.isEmpty()) {
        str = HEADER + "\r\n" + str;
    }

    return str;
}


}

Итак, у меня есть пара вопросов на самом деле здесь;Во-первых, doCsv () выглядит нормально, и если я хочу это проверить, какие параметры нужно назначить для метода?

1 Ответ

0 голосов
/ 19 декабря 2018

Похоже, он делает именно то, что вы просили об этом.Поскольку ваша полезная нагрузка имеет два объекта json, вы получаете массив из двух объектов JsonData.

Если вы хотите регистрировать фактические полезные данные, попробуйте следующее:

<json:json-to-object-transformer returnClass="JsonData" doc:name="JSON to Object"/>
<foreach collection="#[payload]" doc:name="For Each">
    <object-to-string-transformer doc:name="Object to String"/>
    <logger message="#[payload]" level="INFO" doc:name="Logger"/>
</foreach>

Возможно, вам понадобится toString () в вашем POJO.

ОБНОВЛЕНИЕ: я бы рекомендовал вам Преобразование JSON в XLS / CSV в Java

...