Java 将JSON响应解析为对象

Java 将JSON响应解析为对象,java,json,rest,jersey,Java,Json,Rest,Jersey,晚上好, 我是web服务的新手,我只想编写一个简单的客户端,只需从REST调用中获取响应。 我下载并将jersey-bundle-1.17.1.jar添加到我的构建路径中,发现了一段工作代码,它对url进行REST调用,并以字符串的形式返回响应 import javax.ws.rs.core.MediaType; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; i

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

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();
        }
    }
}
但是我不想通过字符串操作来获得我感兴趣的部分响应

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


试试#1-

2013年9月15日凌晨2:46:13 com.sun.jersey.api.client.ClientResponse getEntity
严重:Java类Java.util.Map、Java类型Java.util.Map和MIME媒体类型application/json的消息体读取器;未找到字符集=UTF-8
2013年9月15日凌晨2:46:13 com.sun.jersey.api.client.ClientResponse getEntity
严重:与MIME媒体类型兼容的已注册邮件正文读取器包括:
应用程序/json;字符集=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:Java类Java.util.Map、Java类型Java.util.Map和MIME媒体类型application/json的消息体读取器;未找到字符集=UTF-8
位于com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:561)
在com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:535)上
位于com.sun.jersey.api.client.WebResource.handle(WebResource.java:696)
com.sun.jersey.api.client.WebResource.access$300(WebResource.java:74)
位于com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:512)
main(TestJerseyClientAdvanced.java:36)

参见此示例…单击此按钮了解更多信息

// The request also includes the userip parameter which provides the end
// user's IP address. Doing so will help distinguish this legitimate
// server-side traffic from traffic which doesn't come from an end-user.
URL url = new URL(
    "https://www.websitelink.com//folderresponsedata
    + "q=Paris%20Hilton&userip=USERS-IP-ADDRESS");
URLConnection connection = url.openConnection();
connection.addRequestProperty("Referer", /* Enter the URL of your site here */);

String line;
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while((line = reader.readLine()) != null) {
 builder.append(line);
}

JSONObject json = new JSONObject(builder.toString());
// now have some fun with the results...
你可以使用图书馆


我建议您使用Jackson来(联合国)编组JSON响应。这可以通过以下两个步骤完成

第一步。创建一个成员/对象名与预期响应匹配的Javabean。e、 g,MyResponse.class

第二步。从客户机响应读取实体时使用JavaBean

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

若您只需要从大JSON响应中获取几个属性,那个么可以使用Jersey客户端和JsonArray或JsonObject实体

String url = "http://api.goeuro.com/api/v2/position/suggest/en/";
String city = "New York";

Client client = ClientBuilder.newClient();
WebTarget webTarget = client.register(JsonProcessingFeature.class).target(url);
JsonArray jsonArray = webTarget.path(city)
    .request(MediaType.APPLICATION_JSON_TYPE).get(JsonArray.class);

for (JsonObject jsonObject : jsonArray.getValuesAs(JsonObject.class)) {
    JsonObject geoPosition = jsonObject.getJsonObject("geo_position");
    System.out.println(Arrays.asList(
        jsonObject.getString("name"), jsonObject.getString("type"),
        geoPosition.get("latitude"), geoPosition.get("longitude")));
}
Maven依赖项

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.22.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-processing</artifactId>
    <version>2.22.1</version>
</dependency>

org.glassfish.jersey.core
泽西岛客户
2.22.1
org.glassfish.jersey.media
jersey媒体json处理
2.22.1
就这么简单:

    ObjectMapper mapper = new ObjectMapper();
    String json = "json value";
    MyClass obj = mapper.readValue(json , MyClass .class);

到目前为止,我已经尝试了这个示例(),但它给了我一个错误:^注释应该是对问题的编辑。我无法运行它,获取错误HTTP状态500-请求处理失败;嵌套的异常是com.sun.jersey.api.client.ClientHandlerException:Java类的消息体读取器。你能解释一下我看到这个异常时遗漏了什么吗?能够解决问题ClientResponse response=Client.create(clientConfig)。资源(uri).accept(MediaType.APPLICATION\uJSON)。标题(“内容类型”,MediaType.APPLICATION_JSON)。获取(MY_RESPONSE.class);从引用类型ClientResponse更改为MyResponse效果很好。MyResponse=Client.create(clientConfig)。资源(uri).accept(MediaType.APPLICATION\uJSON)。标题(“内容类型”,MediaType.APPLICATION_JSON)。get(MyResponse.class);其中MyResponse是您的POJO类注意:如果使用Jersey 1和Maven,您将需要
com.sun.Jersey/Jersey json
pom.xml
上使用类
JSONConfiguration
。对于Jersey 2,使用
response.readEntity(MyResponse.class)
来转换输出
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.22.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-processing</artifactId>
    <version>2.22.1</version>
</dependency>
    ObjectMapper mapper = new ObjectMapper();
    String json = "json value";
    MyClass obj = mapper.readValue(json , MyClass .class);