java - 将 JSON 响应解析为对象

标签 java json rest jersey

晚上好,
我是 Web 服务的新手,我只想编写一个简单的客户端,它只是从 REST 调用中获取响应。
我下载并添加了jersey-bundle-1.17.1.jar到我的构建路径,我找到了一段工作代码,它对 url 进行 REST 调用并返回响应作为 String .

import javax.ws.rs.core.MediaType;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class TestJerseyClient {
    public static void main(String[] args) {
        try {
            Client client = Client.create();
            WebResource webResource = client
                    .resource("http://path/to/service");

            ClientResponse response = webResource
                    .accept(MediaType.APPLICATION_JSON)
                    .get(ClientResponse.class);

            if (response.getStatus() != 200)
                throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());

            String output = response.getEntity(String.class);

            System.out.println("Output from Server .... \n");
            System.out.println(output);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

但我不想通过字符串操作来获取我感兴趣的响应部分。

我更喜欢更结构化的方法,比如获取 Object而不是字符串
(一个 JSON 对象,一个 Map<K,V> 对象,等等...)


尝试#1 - Map<K,V>

Sep 15, 2013 2:46:13 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: A message body reader for Java class java.util.Map, and Java type java.util.Map<java.lang.String, java.lang.Object>, and MIME media type application/json; charset=UTF-8 was not found
Sep 15, 2013 2:46:13 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: The registered message body readers compatible with the MIME media type are:
application/json; charset=UTF-8 ->
  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
  com.sun.jersey.core.impl.provider.entity.DocumentProvider
  com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
  com.sun.jersey.core.impl.provider.entity.EntityHolderReader
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General

com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class java.util.Map, and Java type java.util.Map<java.lang.String, java.lang.Object>, and MIME media type application/json; charset=UTF-8 was not found
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:561)
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:535)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:696)
    at com.sun.jersey.api.client.WebResource.access$300(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:512)
    at rest.TestJerseyClientAdvanced.main(TestJerseyClientAdvanced.java:36)

最佳答案

我建议您使用 Jackson 来(取消)编码 JSON 响应。这可以通过以下两个步骤完成。

第一步。使用与预期响应匹配的成员/对象名称创建一个 java bean。例如,MyResponse.class

第二步。从客户端响应中读取实体时使用 java bean。

private static ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);

ClientResponse response =  Client.create(clientConfig).
            resource(uri).accept(MediaType.APPLICATION_JSON).
            header("content-type", MediaType.APPLICATION_JSON).
            get(MY_RESPONSE.class); 
MyResponse output = response.getEntity(MyResponse.class);

关于java - 将 JSON 响应解析为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18808018/

相关文章:

ios - 我们可以使用纯文本(无 JSON)发送推送通知负载吗?

ios - 如何创建具有多个键的 NSDictionary?

用于调用 REST 服务的 Java API

java - 如何获得带刘海的 Android 手机的正确屏幕尺寸

java - Spring Tool Suite 入门指南不起作用

java - 如何使用破折号作为分隔符在 JSTL 中获取语言环境?

java - 在 Strategy 设计模式中使用抽象类代替接口(interface)

java - Android-改造-java.lang.NullPointerException : Attempt to invoke virtual method

java - 无法将 JSON 数据发布到 Jersey Restful Web 服务

java - 在Spring应用程序中记录容器启动时的静态端点