Java 将 JSON 响应解析为对象

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18808018/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 11:14:49  来源:igfitidea点击:

Parse a JSON response as an object

javajsonrestjersey

提问by rtf

Good evening,
I am a newbie in web services and i just want to write a simple client that simply gets responses from REST calls.
I downloaded and added jersey-bundle-1.17.1.jarto my build path and i found a working piece of code that makes a REST call to a url and returns a response as a String.

晚上好,
我是 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();
        }
    }
}

But i don't want to do string manipulations to get the parts of the response that im interested in.

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

I would prefer a more structured approach, like getting an Objectinstead of a string
(a JSONObject, a Map<K,V>Object, etc...)

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



尝试#1 - Map<K,V>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.access0(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:512)
    at rest.TestJerseyClientAdvanced.main(TestJerseyClientAdvanced.java:36)

回答by Nambi

see this example ...click this linkfor more info

看到这个例子...点击这个链接了解更多信息

// 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...

回答by eugen

You can use Gensonlibrary.

您可以使用Genson库。

// register genson in jersey client
ClientConfig cfg = new DefaultClientConfig(GensonJsonConverter.class);
Client client = Client.create(cfg);
WebResource webResource = client.resource("http://path/to/service");

// you can map it to a pojo, no need to have a string or map
SomePojo pojo = webResource
                .accept(MediaType.APPLICATION_JSON)
                .get(SomePojo.class);

回答by pNut

I recommend you use Hymanson for (un)marshalling JSON responses. This can be done is two steps as below.

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

Step1. create a java bean with member/object names that match the expected response. e.g, MyResponse.class

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

Step2. use the java bean when reading the entity from the client response.

第2步。从客户端响应中读取实体时使用 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);

回答by Yuriy Tumakha

If you need to get only few properties from big JSON response, you can use Jersey client and JsonArray or JsonObject entity.

如果您只需要从大型 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 dependencies

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>

回答by Rzv Razvan

Simple as that :

就那么简单 :

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