【问题标题】:Using jackson to extract inner JSON array list使用jackson提取内部JSON数组列表
【发布时间】:2018-11-08 13:25:41
【问题描述】:

我的 API 需要从下面的 JSON 返回条目对象列表。我正在使用球衣和杰克逊。理想情况下,我只想创建一个 java 类 PermissionEnty ,我的 API 从 JSON 返回 PermissionEntry 对象列表。我无法使用以下方法反序列化?有人可以建议可能是什么问题吗?我已经添加了 UNWRAP_ROOT_VALUE,所以我假设它忽略了“列表”节点,并且我会在“列表”节点下获得项目。

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"
                }
            }
        ]
    }
}

权限条目

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);
    }
}

服务接口

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

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

}

【问题讨论】:

    标签: java json rest jackson


    【解决方案1】:

    我不明白你在这个问题中的意思'谁能告诉我我需要创建多少个 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 
    

    此外,您应该为json 数据中的分页 创建一个给定名称为Pagination 的对象。您可以创建另一个包含List&lt;PermissionEntry&gt;Pagination 的对象,称为ResponseList

    【讨论】:

    • 我添加了额外的类和我正在使用的反序列化器。我不知道这是否是正确的方法。我无法按预期反序列化。我不想为列表和/或根节点创建对象。
    • 错误地编辑了您的评论,请放弃我对您评论的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2018-12-23
    • 2018-07-14
    • 2013-09-18
    相关资源
    最近更新 更多