Форматирование Json Ответ в массив Java - PullRequest
2 голосов
/ 02 августа 2020

В настоящее время я получаю такой ответ от своего API:

[{"$id":"1","accommodation_type":"apartment","max_people":2},{"$id":"2","accommodation_type":"lodge","max_people":5}]

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

id, 1, accommodation_type, apartment, max_people, 2, id, 2, accommodation_type, lodge, max_people 5

OR

1, apartment, 2, ,2, lodge, 5

В настоящее время я пробовал:

String temp[]= AccommodationTypesStr.split(":|\\,|\\}"); // Where AccommodationTypesStr is the input json string

Однако между каждой строкой данных остается пустое пространство в виде элемент в массиве, так что он выглядит так:

id, 1, accomodation_type, apartment, max_people, 2,  ,id, 2, accommodation_type, lodge, max_people 5

Хотя в ответе все еще есть скобки.

Я испортил JSON Object и Array, но не смог все так задавались вопросом, смогу ли я сделать это, отформатировав сам.

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Вы можете использовать ObjectMapper для преобразования строки json в некоторый объект, в данном случае как List<Map<String, Object>>. Затем выполните итерацию по этому списку, используя java stream api.

Зависимость Maven:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.11.1</version>
</dependency>

Чтение json строковое значение:

String json = "[{\"$id\":\"1\",\"accommodation_type\":\"apartment\",\"max_people\":2},{\"$id\":\"2\",\"accommodation_type\":\"lodge\",\"max_people\":5}]";
ObjectMapper mapper = new ObjectMapper();
List<Map<String, Object>> list = mapper.readValue(json, List.class);

Затем выполните итерацию по этому списку:

List<Object> flatList = list.stream()
    .flatMap(element -> element.values().stream())
    .collect(Collectors.toList());

System.out.println(flatList); // [1, apartment, 2, 2, lodge, 5]

Или более подробный вариант:

List<Object> flatList = list.stream()
    .map(Map::values)
    .collect(Collectors.toList());

System.out.println(flatList); // [[1, apartment, 2], [2, lodge, 5]]

И еще:

List<Object> flatList = list.stream()
    .flatMap(element -> element.entrySet().stream())
    .flatMap(entry -> Stream.of(
        entry.getKey().replace("$", ""), // without "$"
        entry.getValue()))
    .collect(Collectors.toList());

System.out.println(flatList);
// [id, 1, accommodation_type, apartment, max_people, 2, id, 2, accommodation_type, lodge, max_people, 5]

В общем, вы можете написать свой собственный алгоритм сглаживания. Например:

0 голосов
/ 02 августа 2020

Вы можете создать класс POJO, а затем использовать библиотеки, такие как Jackson или Gson, для отображения строки JSON в массив экземпляров POJO. В этом случае я буду использовать Jackson, вы можете импортировать его через maven с помощью:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.11.0</version>
</dependency>

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

import com.fasterxml.jackson.annotation.JsonProperty;

public class APIResponse {

    @JsonProperty("$id")
    private int id;

    @JsonProperty("accommodation_type")
    private String accommodationType;

    @JsonProperty("max_people")
    private int maxPeople;

    public int getId() {
        return id;
    }

    public int getMaxPeople() {
        return maxPeople;
    }

    public String getAccommodationType() {
        return accommodationType;
    }

    @Override
    public String toString() {
        return "APIResponse{" +
                "id=" + id +
                ", accommodationType='" + accommodationType + '\'' +
                ", maxPeople=" + maxPeople +
                '}';
    }
}

Затем вы можете десериализовать, используя:

final String json = "[{\"$id\":\"1\",\"accommodation_type\":\"apartment\",\"max_people\":2},{\"$id\":\"2\",\"accommodation_type\":\"lodge\",\"max_people\":5}]";
final ObjectMapper mapper = new ObjectMapper();
APIResponse[] responses = mapper.readValue(json, APIResponse[].class);
for (APIResponse response: responses) {
    System.out.println(response.toString());
}

Результат:

APIResponse{id=1, accommodationType='apartment', maxPeople=2}
APIResponse{id=2, accommodationType='lodge', maxPeople=5}

Наконец, вы можете получить доступ к данным, просто вызвав геттеры в классе POJO:

responses[0].getId(); // 1
responses[1].getAccommodationType; // lodge

Затем, если вы хотите, чтобы данные были разделены запятыми, используйте :

public String[] getByComas(APIResponse[] responses) {
    List<String> data = new ArrayList<>();
    for (APIResponse response: responses) {
        data.add("id,");
        data.add(response.getId() + ",");
        data.add("accommodation_type,");
        data.add(response.getAccommodationType() + ",");
        data.add("max_people,");
        data.add(response.getMaxPeople() + ",");
    }
    return data.toArray(new String[data.size()]);
}

Затем просто используйте:

String[] formattedMessage = getByComas(responses);
for (String s: formattedMessage) {
    System.out.print(s);
}

Результат:

id,1,accommodation_type,apartment,max_people,2,id,2,accommodation_type,lodge,max_people,5,

Настоятельно рекомендуется использовать JSON мапперы, поскольку они довольно надежны при синтаксическом анализе JSON данные.

Сообщите мне, решит ли это вашу проблему!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...