webentwicklung-frage-antwort-db.com.de

Analysieren Sie eine JSON-Antwort als Objekt

Guten Abend,
Ich bin ein Neuling in Webservices und möchte einfach einen einfachen Client schreiben, der einfach Antworten von REST - Aufrufen erhält.
Ich habe jersey-bundle-1.17.1.jar heruntergeladen und in meinen Erstellungspfad eingefügt, und ich habe einen Code gefunden, der einen Aufruf von REST an eine URL ausführt und eine Antwort als String zurückgibt. 

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

Aber ich möchte keine String-Manipulationen durchführen, um die Teile der Antwort zu erhalten, die mich interessieren. 

Ich würde einen eher strukturierten Ansatz vorziehen, als würde man statt einer Zeichenkette eine Object bekommen
(ein JSON-Objekt, ein Map<K,V>-Objekt usw.) 


TRY # 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)
8
rtf

Ich empfehle Ihnen, Jackson für (das) Rangieren von JSON-Antworten zu verwenden. Dies kann in zwei Schritten wie folgt durchgeführt werden.

Schritt 1. Erstellen Sie eine Java-Bean mit Element-/Objektnamen, die der erwarteten Antwort entsprechen. z. B. MyResponse.class

Schritt 2. Verwenden Sie die Java-Bean, wenn Sie die Entität aus der Client-Antwort lesen.

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

Sie können Genson library verwenden.

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

Wenn Sie nur wenige Eigenschaften aus einer großen JSON-Antwort abrufen müssen, können Sie Jersey-Client und JsonArray- oder JsonObject-Entität verwenden.

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

Abhängigkeiten von 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>
4
Yuriy Tumakha

siehe dieses Beispiel ... Klicken Sie auf dieses Link für weitere Informationen

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

So einfach ist das : 

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