2010-11-29 6 views
0

je la chaîne JSON suivante, résultant d'une requête de recherche google:Json: Comment extraire des objets JSON internes d'un seul extérieur objet JSON en utilisant java

{"responseData":{"results":[{"region":"IL","streetAddress":"1611 South Randall Road","titleNoFormatting":"Brunswick Zone XL Randall Road","staticMapUrl":"http:\/\/maps.google.com\/maps\/api\/staticmap?maptype=roadmap&format=gif&sensor=false&size=150x100&zoom=13&markers=42.162958,-88.334155","listingType":"local","addressLines":["1611 South Randall Road","Algonquin, IL"],"lng":"-88.334155","phoneNumbers":[{"type":"","number":"(847) 658-2257"}],"url":"http:\/\/www.google.com\/maps\/place?source=uds&q=brunswick+zone&cid=8286591317090502839","country":"United States","city":"Algonquin","content":"","GsearchResultClass":"GlocalSearch","maxAge":604800,"title":"<b>Brunswick Zone<\/b> XL Randall Road","ddUrlToHere":"http:\/\/www.google.com\/maps?source=uds&daddr=1611+South+Randall+Road,+Algonquin,+IL+(Brunswick+Zone+XL+Randall+Road)[email protected],-88.334155&iwstate1=dir:to","ddUrl":"http:\/\/www.google.com\/maps?source=uds&daddr=1611+South+Randall+Road,+Algonquin,+IL+(Brunswick+Zone+XL+Randall+Road)[email protected],-88.334155&saddr=60102","ddUrlFromHere":"http:\/\/www.google.com\/maps?source=uds&saddr=1611+South+Randall+Road,+Algonquin,+IL+(Brunswick+Zone+XL+Randall+Road)[email protected],-88.334155&iwstate1=dir:from","accuracy":"8","lat":"42.162958","viewportmode":"explicit"},{"region":"IL","streetAddress":"2075 East Algonquin Road","titleNoFormatting":"Brunswick Zone Algonquin","staticMapUrl":"http:\/\/maps.google.com\/maps\/api\/staticmap?maptype=roadmap&format=gif&sensor=false&size=150x100&zoom=13&markers=42.154629,-88.265871","listingType":"local","addressLines":["2075 East Algonquin Road","Algonquin, IL"],"lng":"-88.265871","phoneNumbers":[{"type":"","number":"(847) 658-9200"}],"url":"http:\/\/www.google.com\/maps\/place?source=uds&q=brunswick+zone&cid=7798335569608325784","country":"United States","city":"Algonquin","content":"","GsearchResultClass":"GlocalSearch","maxAge":604800,"title":"<b>Brunswick Zone<\/b> Algonquin","ddUrlToHere":"http:\/\/www.google.com\/maps?source=uds&daddr=2075+East+Algonquin+Road,+Algonquin,+IL+(Brunswick+Zone+Algonquin)[email protected],-88.265871&iwstate1=dir:to","ddUrl":"http:\/\/www.google.com\/maps?source=uds&daddr=2075+East+Algonquin+Road,+Algonquin,+IL+(Brunswick+Zone+Algonquin)[email protected],-88.265871&saddr=60102","ddUrlFromHere":"http:\/\/www.google.com\/maps?source=uds&saddr=2075+East+Algonquin+Road,+Algonquin,+IL+(Brunswick+Zone+Algonquin)[email protected],-88.265871&iwstate1=dir:from","accuracy":"8","lat":"42.154629","viewportmode":"explicit"}],"viewport":{"center":{"lng":"-88.48145","lat":"42.281384"},"sw":{"lng":"-88.74015","lat":"42.129276"},"ne":{"lng":"-88.222755","lat":"42.43349"},"span":{"lng":"0.51739","lat":"0.304211"}},"cursor":{"moreResultsUrl":"http:\/\/www.google.com\/local?oe=utf8&ie=utf8&num=4&mrt=yp,loc&sll=37.779160,-122.420090&start=0&hl=en&q=brunswick+zone+60102","currentPageIndex":0,"estimatedResultCount":"258","pages":[{"start":"0","label":1},{"start":"4","label":2},{"start":"8","label":3},{"start":"12","label":4}]}},"responseStatus":200,"responseDetails":null} 

L'étiquette plus externe (simple) est " responseData " La première étiquette imbriquée (également unique) est" results " Dans l'objet" results ", j'ai 2 ensembles de données nets, chacun représentant un seul résultat de recherche google complet, qui contient les éléments dont j'ai besoin, tels que comme: "titleNoFormatting", "addressLines" et "phoneNumbers". Je suis en train d'écrire ma première application Java Android, et j'ai vraiment du mal à extraire les valeurs dont j'ai besoin. J'ai regardé dans Gson et Jackson, mais, était incapable de concevoir une solution pour moi-même. Je pense qu'une partie du problème peut être liée à un fait: ces ensembles de données internes n'ont pas de noms de conteneurs explicites, ils ont simplement une structure identique: l'étiquette externe "results" est présente une seule fois et contient les deux ensembles de données identiques. Quelqu'un pourrait-il, s'il vous plaît, donner un exemple de la façon de gérer cela?

Répondre

2

Dans Gson, le {} dans JSON peut être mappé à Map<String, Object> ou un Javabean digne de mention. Le [] dans JSON peut être mappé à un List<Object> ou un Object[].

Avec votre structure actuelle et Google Gson, je suggère ce qui suit:

public class GoogleResults { 
    private ResponseData responseData; 
    // Add/generate getter+setter. 

    static class ResponseData { 
     private List<Result> results; 
     // Add/generate getter+setter. 
    } 

    static class Result { 
     private String titleNoFormatting; 
     private List<String> addressLines; 
     private List<Map<String, String>> phoneNumbers; // Or List<PhoneNumber> 
     // Add/generate getters+setters. 
    } 
} 

que vous pouvez utiliser comme suit:

GoogleResults results = new Gson().fromJson(json, GoogleResults.class); 
1

Vous pouvez utiliser Android de JSONObject pour créer un objet JSON représentation à partir d'une chaîne JSON.

Par exemple,

JSONObject json = new JSONObject("..."); //Where the string value is the JSON from your question. 
JSONArray results = json.getJSONObject("responseData").getJSONArray("results); 

Et vous pouvez maintenant itérer results via length().