2

我正在使用 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为根节点的最佳方法是什么?

我正在为我的 API 方法使用RESTEasy 代理框架

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

    ...
}
4

2 回答 2

3

我同样希望不必为包含比我关心的更多字段的消息定义复杂的 Java 类。在我的 JEE 服务器 (WebSphere) 中,Jackson 是底层 JSON 实现,这似乎是 RESTEasy 的一个选项。Jackson 有一个@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 技术。)

于 2016-09-09T14:13:01.110 回答
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);
于 2016-09-09T10:20:30.297 回答