2013-05-23 8 views
7

J'essaye d'analyser json en java.Objet JSON String to Java utilisant GSON

J'ai la chaîne suivante qui est JSON valide selon jsonlint.com

private final static String LOC_JSON = 
     "[" 
     +"{" 
     +" \"lat1\": 39.737567," 
     +" \"lat2\": 32.7801399," 
     +" \"long1\": -104.98471790000002," 
     +" \"long2\": -96.80045109999998" 
     +"}," 
     +" [" 
     +"  {" 
     +"   \"lat\": {" 
     +"    \"b\": 38.88368709500021," 
     +"    \"d\": 40.620468491667026" 
     +"   }," 
     +"   \"long\": {" 
     +"   \"b\": -105.75306170749764," 
     +"   \"d\": -104.675854661387" 
     +"   }" 
     +"  }" 
     +" ]" 
     +"]"; 

Je suis en train de l'analyser dans un objet et je reçois l'erreur suivante. "BEGIN_OBJECT EXPECTED était BEGIN_ARRAY à la ligne 1 colonne 2"

  Gson gson = new Gson(); 
     BoxSearch b = gson.fromJson(LOC_JSON, BoxSearch.class); 

BoxSearch se compose de cela.

private Number lat1; 
private Number lat2; 
private Number long1; 
private Number long2; 
private Boxes[] boxes; 

Les boîtes sont un objet Latitude et un objet Longitude qui sont tous deux définis comme identiques.

private String b; 
private String d; 

je peux analyser les attributs de niveau supérieur (lat1, lat2, long1 et LONG2) dans un objet BoxSearch plus simple qui ne dispose que ces 4 attributs. Le problème vient quand le json et l'objet sont plus complexes. Est-il même possible de faire ce que j'essaie?

J'espère avoir fourni suffisamment d'informations pour obtenir de l'aide. Je serais heureux de fournir plus d'informations ou même un projet de test si nécessaire. Je cours cela comme un test de junit.

Merci.

+3

duplication possible de [lancer GSON "BEGIN \ _OBJECT attendu mais BEGIN \ _ARRAY"?] (Http://stackoverflow.com/questions/9598707/gson-throwing-expected-begin-object-but-was-begin -array) - votre JSON est un tableau, pas un objet. Vous allez avoir un problème parce que c'est un tableau contenant différents types d'objets (un objet et un tableau) que vous ne pouvez pas traiter sans écrire un désérialiseur personnalisé –

+0

@BrianRoach cela ressemble plus à une réponse;) –

+0

@RC. Ouais ... Hmm. Je pense que peut-être je vais le déplacer, le vieux Q répond pourquoi il obtient l'erreur, mais la résolution de son cas est différente –

Répondre

16

La raison de l'erreur est que votre JSON au niveau supérieur est un tableau, pas un objet. Cela est couvert par GSON throwing "Expected BEGIN_OBJECT but was BEGIN_ARRAY"?.

Cependant, la solution ne fonctionnera pas pour votre JSON car vous disposez d'un tableau de types mixtes (un objet et un tableau) plutôt qu'un tableau d'un seul type d'objet. Pour cela, vous devrez écrire un désérialiseur personnalisé (voir The section of the Gson user's guide that covers this) ou utiliser la classe JsonParser de Gson directement et extraire les données de l'arbre d'analyse.

Modifier des commentaires ci-dessus:

Si vous êtes celui créant le JSON, il semble comme ce que vous voulez est un tableau de BoxSearch objets?

En fonction de votre classe Java BoxSearch, vous aurez besoin JSON structuré comme:

[ 
    { 
     "lat1" : 39.737567, 
     "lat2" : 32.7801399, 
     "long1" : -104.98471790000002, 
     "long2" : -96.80045109999998, 
     "boxes" : [ 
        { 
         "lat": { 
          "b": 38.88368709500021, 
          "d": 40.620468491667026 
         }, 
         "long": { 
          "b": -105.75306170749764, 
          "d": -104.675854661387 
         } 
        } 
        ] 
    } 
] 

Cependant, la façon dont vous avez Boxes classe définie ne fonctionnera pas pour cela. (Vouliez-vous en avoir un tableau?). Comme-est-il devrait ressembler à:

class Boxes { 
    Box lat; 
    @SerializedName("long") 
    Box lon; 
} 

class Box { 
    String b; 
    String d; 
} 

Maintenant, vous avez un tableau contenant un type d'objet (BoxSearch) que vous pouvez désérialiser avec:

Type collectionType = new TypeToken<Collection<BoxSearch>>(){}.getType(); 
Collection<BoxSearch> boxSearchCollection = gson.fromJson(json, collectionType); 

Si vous avez vraiment pas besoin un tableau de ceux-ci, se débarrasser de la matrice externe et simplement faire:

gson.fromJson(json, BoxSearch.class); 
+0

Merci beaucoup Brian, ce léger tweak au json et tout va bien. Je voterais pour cette réponse, mais je n'ai pas de «crédibilité de la rue». Le code fonctionne comme un champion. Dans le cas où les gens copier et coller cette réponse, Box long; doit être renommé :-) – user2415153

+0

Oh et oui j'avais besoin du tableau. Merci encore. – user2415153

+0

@ user2415153 J'ai changé le code pour qu'il fonctionne avec '' long ''dans le JSON - voir la réponse maintenant :) Je n'ai pas remarqué ça, désolé. Quant à l'upvoting - vous pouvez accepter ma réponse;) et heureux que je puisse vous aider! –

13
Gson gson = new Gson(); 
gson.fromJson(jsonStr,YourClass.class); 

très facile.

+0

il m'aide à convertir un objet json qui a une liste à l'intérieur. Je convertis la chaîne json en Object.class – Ashkan