当前位置: 首页 > 知识库问答 >
问题:

提取RESTEasy客户端中JSON响应的特定节点

利博远
2023-03-14

我正在使用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" }
    ]
  }
}

现在,我只提取对象映射的<code>项

我将RESTEasy代理框架用于我的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个答案

国胤
2023-03-14

您可以创建一个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 = ClientBuilder.newClient();
client.register(CustomReaderInterceptor.class);
申屠泳
2023-03-14

我同样希望不必为包含比我关心的字段多得多的消息定义复杂的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遥感技术。)

 类似资料:
  • 我想从服务器获取一个.json文件到客户端的.js文件 下面是app.js:(服务器代码) 我需要它在js文件:

  • 我在RestEasy客户端-3.0.8中得到以下异常

  • 我正在尝试编写简单的RESTEasy客户端。下面给出了示例代码: 我在行中得到异常: 我在控制台中看到以下错误: 更新:我还尝试在POM中添加resteasy jax-rs依赖关系。我还通过在web.xml中添加以下行来验证是否启用了ResteasyProviderFactory: 请查看以下maven依赖项列表: 但这不起作用。 但现在我看到了其他方法的类似异常: 我在行中看到了这个例外: 奇怪

  • 我认为这个客户机库很方便,并希望继续使用它,但我如何驯服它或重写它,以便返回真正的错误消息?

  • 我不知道这里有什么问题。我想发出一个响应二进制数据(例如文件下载)而不是JSON的HTTP请求。 这些行是可以的-但需要JSON。 但我需要将响应定义为不是 JSON。 在这里,我遇到了一个问题。我也尝试了“斑点”。我总是在编译时收到一个类型脚本错误。 类型'{resseType:"string";}'的参数不能分配给类型'{Headers?: HttpHeaders|{[head: string

  • 只是想知道有没有办法得到spring Web-Flux的web客户端的响应时间?