我正在使用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();
...
}
答案 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();
}
}
中注册上面创建的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。)