在RESTEasy Client中提取JSON响应的特定节点

时间:2016-09-08 11:16:50

标签: java java-ee jax-rs resteasy jackson2

我正在使用RESTEasy客户端从API检索JSON字符串。 JSON有效负载看起来像这样:

{
  "foo1" : "",
  "foo2" : "",
  "_bar" : {
    "items" : [
      { "id" : 1 , "name" : "foo", "foo" : "bar" },
      { "id" : 2 , "name" : "foo", "foo" : "bar" },
      { "id" : 3 , "name" : "foo", "foo" : "bar" },
      { "id" : 4 , "name" : "foo", "foo" : "bar" }
    ]
  }
}

现在我想只提取items节点进行对象映射。截取JSON响应主体并将其修改为以items作为根节点的最佳方法是什么?

我使用RESTEasy proxy framework作为我的API方法。

REST客户端代码:

ResteasyWebTarget target = client.target("https://"+server);
target.request(MediaType.APPLICATION_JSON);
client.register(new ClientAuthHeaderRequestFilter(getAccessToken()));
MyProxyAPI api = target.proxy(MyProxyAPI.class);
MyDevice[] result = api.getMyDevice();

RESTEasy代理接口:

public interface MyProxyAPI {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/device")
    public MyDevice[] getMyDevices();

    ...
}

2 个答案:

答案 0 :(得分:1)

你可以创建一个ReaderInterceptor并使用Jackson来操纵你的JSON:

public class CustomReaderInterceptor implements ReaderInterceptor {

    private ObjectMapper mapper = new ObjectMapper();

    @Override
    public Object aroundReadFrom(ReaderInterceptorContext context) 
                      throws IOException, WebApplicationException {

        JsonNode tree = mapper.readTree(context.getInputStream());
        JsonNode items = tree.get("_bar").get("items");
        context.setInputStream(new ByteArrayInputStream(mapper.writeValueAsBytes(items)));
        return context.proceed();
    }
}

然后在ReaderInterceptor

中注册上面创建的Client
Client client = ClientBuilder.newClient();
client.register(CustomReaderInterceptor.class);

答案 1 :(得分:1)

我有同样的愿望,不必为包含比我关心的更多字段的消息定义复杂的Java类。在我的JEE服务器(WebSphere)中,Jackson是底层的JSON实现,它似乎是RESTEasy的一个选项。杰克逊有一个@JsonIgnoreProperties注释,可以忽略未知的JSON字段:

import javax.xml.bind.annotation.XmlType;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;

@XmlType
@JsonIgnoreProperties(ignoreUnknown = true)
public class JsonBase {}

我不知道其他JSON实现是否具有类似功能,但它似乎是一个自然的用例。

(我还用这个和其他一些与我的WebSphere环境相关的JAX-RS技术写了blog post。)