2013-10-12 17 views
32

Dato il seguente file .json:JsonMappingException: fuori START_ARRAY gettone

[ 
    { 
     "name" : "New York", 
     "number" : "732921", 
     "center" : [ 
       "latitude" : 38.895111, 
       "longitude" : -77.036667 
      ] 
    }, 
    { 
     "name" : "San Francisco", 
     "number" : "298732", 
     "center" : [ 
       "latitude" : 37.783333, 
       "longitude" : -122.416667 
      ] 
    } 
] 

ho preparato due classi per rappresentare i dati contenuti:

public class Location { 
    public String name; 
    public int number; 
    public GeoPoint center; 
} 

...

public class GeoPoint { 
    public double latitude; 
    public double longitude; 
} 

Per analizzare il contenuto dal file .json, utilizzo Jackson 2.2.x e ho preparato il seguente metodo:

public static List<Location> getLocations(InputStream inputStream) { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    try { 
     TypeFactory typeFactory = objectMapper.getTypeFactory(); 
     CollectionType collectionType = typeFactory.constructCollectionType(
              List.class, Location.class); 
     return objectMapper.readValue(inputStream, collectionType); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

Finché non esco dalla proprietà center, è possibile analizzare tutto il contenuto. Tuttavia, quando si tenta di analizzare le coordinate geografiche io alla fine con il seguente messaggio di errore:

com.fasterxml.jackson.databind.JsonMappingException: Impossibile deserializzare istanza di
com.example.GeoPoint fuori Token START_ARRAY su [Fonte: [email protected]; line: 5, colonna: 25]
(attraverso la catena di riferimento: com.example.Location [ "centro"])

+0

perché sono tu usi Jackson se puoi semplicemente analizzarlo con parser json –

+3

La tua stringa JSON non è corretta, il tipo di 'center' è una matrice di oggetti non validi.Prova a sostituire '[' e ']' con '{' e '}' nella stringa JSON attorno a 'longitude' e' latitude' in modo che diventino oggetti. – Katona

+0

@Katona Grazie. Puoi per favore convertire il tuo commento in una risposta in modo da poter chiudere la domanda ?! – JJD

risposta

31

La stringa JSON è corretto: il tipo di center è un array di oggetti non validi. Sostituire [ e ] con { e } nella stringa JSON intorno longitude e latitude in modo che saranno oggetti:

[ 
    { 
     "name" : "New York", 
     "number" : "732921", 
     "center" : { 
       "latitude" : 38.895111, 
       "longitude" : -77.036667 
      } 
    }, 
    { 
     "name" : "San Francisco", 
     "number" : "298732", 
     "center" : { 
       "latitude" : 37.783333, 
       "longitude" : -122.416667 
      } 
    } 
] 
33

JsonMappingException: out of START_ARRAY token viene generata un'eccezione da Jackson oggetto mapper come si aspetta un Object {} mentre trovato un Array [{}] in risposta.

Questo problema può essere risolto sostituendo Object con Object[] nell'argomento per geForObject("url",Object[].class). Riferimenti:

  1. Ref.1
  2. Ref.2
  3. Ref.3
+0

grazie, informazioni basilari ma necessarie –

+0

Questo ha funzionato per me! Ho avuto un Product.class e ho appena aggiunto la classe Product []. Bam! Lavoro. Grazie Abhijeet! – Jonathan

1

Come detto, JsonMappingException: out of START_ARRAY token viene generata un'eccezione da Jackson oggetto mapper come si aspetta un Object {} mentre trovato un Array [{}] in risposta.

Una soluzione più semplice potrebbe essere la sostituzione del metodo getLocations con:

public static List<Location> getLocations(InputStream inputStream) { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    try { 
     TypeReference<List<Location>> typeReference = new TypeReference<>() {}; 
     return objectMapper.readValue(inputStream, typeReference); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

D'altra parte, se non si dispone di un POJO come Location, è possibile utilizzare:

TypeReference<List<Map<String, Object>>> typeReference = new TypeReference<>() {}; 
return objectMapper.readValue(inputStream, typeReference); 
+0

Grazie per aver condiviso questa implementazione alternativa. Puoi dire se ci sono vantaggi o svantaggi nell'usare 'CollectionType' contro' TypeReference'? – JJD

+0

La sintassi 'TypeReference' è molto più corta dell'altra. Non sono sicuro, se in alcuni casi potrebbe esserci una controindicazione relativa alla cancellazione del tipo ... ma nel mio mondo "TypeReference" è più semplice da usare e capire. – freedev

Problemi correlati