Использование jackson для извлечения внутреннего списка массивов JSON - PullRequest
0 голосов
/ 08 ноября 2018

Мой API должен вернуть список объектов ввода из JSON ниже. Я использую Джерси и Джексон. В идеале я хотел бы создать только java-класс PermissionEnty и мой API-интерфейс для возврата списка объектов PermissionEntry из JSON. Я не могу десериализовать, используя приведенный ниже подход? Может кто-нибудь посоветовать, в чем может быть проблема? Я добавил UNWRAP_ROOT_VALUE, поэтому я предполагаю, что узел 'list' игнорируется, и я получаю элементы ниже узла 'list'.

public class PermissionEntry {

    private String id;
    private String displayName;
    private String memberType;
}

и JSON;

{
    "list": {
        "pagination": {
            "count": 5,
            "hasMoreItems": false,            
        },
        "entries": [
            {
                "entry": {
                    "displayName": "norma",
                    "id": "norma",
                    "memberType": "PERSON"
                }
            },              
            {
                "entry": {
                    "displayName": "clara",
                    "id": "clara",
                    "memberType": "PERSON"
                }
            },
            {
                "entry": {
                    "displayName": "michael",
                    "id": "mich",
                    "memberType": "PERSON"
                }
            }
        ]
    }
}

PermissionEntries

public class PermissionEntries {
  @JsonProperty(value = "entries")
    @JsonDeserialize(using = PermissionEntryDeserializer.class)
    private List<PermissionEntry> entries;

    public List<PermissionEntry> getEntries() {
        return entries;
    }

    public void setEntries(List<PermissionEntry> entries) {
        this.entries = entries;
    }
}

Ниже приведен десериализатор, который я использую

public class PermissionEntryDeserializer extends JsonDeserializer<List<PermissionEntry>> {

    private static final String ENTRY = "entries";
    private static final ObjectMapper mapper = new ObjectMapper()
            .configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
    private static final CollectionType collectionType =
            TypeFactory
                    .defaultInstance()
                    .constructCollectionType(List.class, PermissionEntry.class);

    @Override
    public List<PermissionEntry> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException {

        ObjectNode objectNode = mapper.readTree(jsonParser);
        JsonNode nodeEntries = objectNode.get(ENTRY);

        if (null == nodeEntries                     // if no ENTRY node could be found
                || !nodeEntries.isArray()           // or ENTRY node is not an array
                || !nodeEntries.elements().hasNext())   // or ENTRY node doesn't contain any entry
            return null;

        return mapper.readerFor(collectionType).readValue(nodeEntries);
    }
}

Сервисный API

public Optional<List<PermissionEntry>> getPermissionsForGroup(String groupName) {
            Response response = getTarget()
                    .path("/api/group/" + groupName + "/members")
                    .request()
                    .get();

                PermissionEntries list = response.readEntity(PermissionEntries.class);

}

1 Ответ

0 голосов
/ 08 ноября 2018

Я не понимаю, что вы имеете в виду в этом вопросе ' Может кто-нибудь сказать, пожалуйста, сколько java-классов мне нужно создать, чтобы получить список записей. ', но у вас уже есть объект ввода называется PermissionEntry. У вас будет список этого объекта.

Это jersey клиент ваших данных с jakcson.

 ClientConfig clientConfig = new DefaultClientConfig();
 clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
 Client client = Client.create(clientConfig);

 String URL = "http://{{host}}:{{port}}/entry";
 WebResource webResourceGet = client.resource(URL);
 ClientResponse response = webResourceGet.accept("application/json").get(ClientResponse.class);
 String output = response.getEntity(String.class);
 ResponseList responseList= mapper.readValue(output , ResponseList .class);//here is the permissionEntry list that you wil have 

Кроме того, вы должны создать объект с именем Pagination для нумерации страниц , который находится в данных json. Вы можете сделать еще один объект, который включает List<PermissionEntry> и Pagination и называется ResponseList.

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