2017-03-20 6 views
1

Je récupère un JSON en utilisant Retrofit 2, qui transporte un objet si la clé a une valeur autre qu'un tableau vide. ex:Vérification de l'objet JSON dans Java

Si la clé à savoir adresse a des valeurs, il retourne l'objet

{ 
    "student": { 
     "name": "Some name", 
     "address": { 
      "house": "5", 
      "road": "3" 
     } 
    } 
} 

Si la clé à savoir adresse n'a pas de valeur, il retourne un tableau vide

{ 
    "student": { 
     "name": "Some name", 
     "address": [] 
    } 
} 

Dans ma classe POJO, j'ai fait en sorte que mon type de classe Address soit objecté afin que retrofit puisse analyser le JSON.

public class Student { 

@SerializedName("name") 
@Expose 
private String name; 
@SerializedName("address") 
@Expose 
private Object address; 

public String getName() { 
return name; 
} 

public void setName(String name) { 
this.name = name; 
} 

public Object getAddress() { 
return address; 
} 

public void setAddress(Object address) { 
this.address = address; 
} 

} 

Maintenant, comment puis-je vérifier que le type d'adresse est objet ou un tableau?

J'ai essayé avec isArray(), mais je n'ai pas trouvé de résultat.

if(obj.getclass().isArray()) 

Merci d'avance.

+1

Vous pouvez le faire '(obj instanceof JSONObject) 'ou' (instanceobj de JSONArray) ' –

+0

vérifiez si cela vous aide http://stackoverflow.com/a/13100642/2116420 – Naz141

Répondre

0

Vous pouvez vérifier à travers instanceof est l'objet est JosnObject ou JsonArray?

if (address instanceof JSONObject) { 
JSONObject jsonObject = (JSONObject) address; 
} 
else if (address instanceof JSONArray) { 
JSONArray jsonArray = (JSONArray) address; 
} 
0

Vous pouvez aller pour la validation du schéma JSON où vous devez definie tout le type de reclassement et le format de JSON et plus tard valider votre JSON en utilisant Jackson bibliothèques 2.x et fge/JSON-schéma-validateur.

Lien de référence pour plus de détails.

http://wilddiary.com/validate-json-against-schema-in-java/

0

Je me demande pourquoi votre json est pas compatible? Je veux dire, s'il n'y a pas de valeur dans l'adresse, il ne devait pas être un JSONArray

Au contraire, il censé être -

"address": { 
    "house": "", 
    "road": "" 
} 

Il facile d'analyser si vous faites comme ci-dessus - Maintenant, vous Pojo sera -

public class Address { 

@SerializedName("house") 
@Expose 
private String house; 
@SerializedName("road") 
@Expose 
private String road; 

public String getHouse() { 
return house; 
} 

public void setHouse(String house) { 
this.house = house; 
} 

public String getRoad() { 
return road; 
} 

public void setRoad(String road) { 
this.road = road; 
} 

} 

Et enfin, vous pouvez obtenir le Address en utilisant -

@SerializedName("address") 
@Expose 
private Address address; 

dans votre Student classe

PS,
problèmes côté serveur doivent être fixés par côté serveur.

0

Merci à tous. J'ai trouvé ma réponse avec l'aide de instanceof. Au lieu de vérifier directement l'adresse obj, je dois convertir la valeur en type d'objet, à savoir

Gson gson = new GsonBuilder().serializeNulls().setLenient().create(); 
String jsonStr = gson.toJson(obj.getAddress()); 
Object json = new JSONTokener(jsonStr).nextValue(); 

Et puis je peux vérifier avec JSONObject

if (json instanceof JSONObject) { 
// Object 
}else{ 
// Array 
}