2016-09-08 1 views
0

Ich bin eine JSON-Zeichenfolge von einer API mit einem RESTEasy-Client abrufen. Die JSON Nutzlast sieht ungefähr so ​​aus:Spezifischen Knoten der JSON-Antwort in RESTEasy Client extrahieren

{ 
    "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" } 
    ] 
    } 
} 

Jetzt würde ich nur die items Knoten für die Objektzuordnung extrahieren möchten. Was ist der beste Weg, den JSON-Antworttext abzufangen und ihn so zu ändern, dass er items als Root-Knoten hat?

Ich verwende die RESTEasy proxy framework für meine API-Methoden.

Der REST-Client-Code:

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 Proxy-Interface:

public interface MyProxyAPI { 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    @Path("/device") 
    public MyDevice[] getMyDevices(); 

    ... 
} 
+0

zum Objekt Javascript konvertieren und es als ein Objekt abzuzurufen. – SaviNuclear

+0

Ist es wichtig, dass 'items' die Wurzel sind, oder nur, dass Sie keine anderen Elemente der Nachricht zuordnen möchten? Wenn Sie sich die RestEasy-Dokumente ansehen, verwenden Sie automatisches Marshalling/Unmarshalling für Java-Beans über einen JAXB-Provider. – dbreaux

+0

@dbreaux Ja, ich möchte einfach keine anderen Elemente zuordnen. Siehe meine Bearbeitung des OP für einen vereinfachten Implementierungscode. Ich könnte natürlich einen Anbieter registrieren, um den Nachrichtentext zu ändern, aber ich frage mich, wie die Implementierung eines solchen Anbieters aussehen würde. –

Antwort

1

Sie eine ReaderInterceptor schaffen könnte und Jackson verwenden Ihre JSON zu manipulieren:

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

das dann registrieren ReaderInterceptor oben in Ihrem Client erstellt:

+1

Eigentlich könnte eine Ihrer Antworten auf eine andere Frage auch eine einfache Lösung sein: http://stackoverflow.com/a/38352932/796761 – dbreaux

+0

@dbreaux Danke für die Erinnerung daran :) –

+1

Ihre ältere Lösung von dbreaux verbunden (Den JSON holen und über den Jackson-Baum auf den gewünschten Knoten zugreifen) habe ich bis jetzt als Workaround gemacht. Dies funktioniert natürlich nicht mit dem Proxy-Framework. Ich werde den Abfangjäger versuchen. Vielen Dank. –

1

Ich hatte den gleichen Wunsch, keine komplexen Java-Klassen für Nachrichten zu definieren, die viel mehr Felder enthalten, als mir wichtig sind. In meinem JEE-Server (WebSphere) ist Jackson die zugrunde liegende JSON-Implementierung, die mit RESTEasy eine Option zu sein scheint. Jackson hat eine @JsonIgnoreProperties Anmerkung, die unbekannten JSON Felder ignorieren kann:

import javax.xml.bind.annotation.XmlType; 
import org.codehaus.jackson.annotate.JsonIgnoreProperties; 

@XmlType 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class JsonBase {} 

Ich weiß nicht, ob andere JSON-Implementierungen eine ähnliche Fähigkeit haben, aber es scheint sicher einen natürlichen Anwendungsfall.

(Ich schrieb auch eine blog post mit diesem und einigen anderen JAX-RS Techniken relevant für meine WebSphere-Umgebung.)

+0

Es ist eine nette Lösung, aber es könnte nicht für die Situation von der OP beschrieben funktionieren. Der 'Items'-Knoten ist ein Kind von' _bar' und kein Kind des Wurzelknotens. –

+0

Sie können dies immer noch tun, indem Sie Wrapper-Klassen definieren, die fast nichts enthalten. In meinem Fall war das besser als die Alternativen. – dbreaux

+0

Macht Sinn. Upvoted. –

Verwandte Themen