2016-08-10 8 views
0

J'essaie d'imprimer la liste des entreprises.Parsing JSON Array

Mon objet JSON:

{ 
    "Name": "crunchify.com", 
    "Author": "App Shah", 
    "Company List": [ 
     "Compnay: eBay", 
     "Compnay: Paypal", 
     "Compnay: Google" 
    ] 
} 

Code:

public class ProductTypeParser { 

    public void parseJson(JSONObject jsonObject) throws ParseException { 



     JSONObject object = (JSONObject) jsonObject; 
     String name = (String) object.get("Name"); 
     System.out.println(name); 

     String age = (String) object.get("Author"); 
     System.out.println(age); 

     //loop array   
     JSONArray msg = (JSONArray) object.get("Company List"); 
     Iterator<String> iterator = msg.iterator(); 
     while (iterator.hasNext()) { 
      System.out.println(iterator.next()); 
     }  
    } 
} 

Erreur:

SEVERE: Servlet.service() for servlet [contextServlet] in context with path [/SpringSafeHouseService2.0] 
    threw exception [Request processing failed; nested exception is 
    java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.json.simple.JSONArray] 
    with root cause java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.json.simple.JSONArray 
+0

Juste une remarque: vous devez factoriser vos noms avant de mettre votre code dans la production. ;) - 'String age = (Chaîne) object.get (" Auteur ");' ... – Thomas

+1

Il est dit exactement dans le message d'erreur: vous ne pouvez pas lancer un 'ArrayList' à un' JSONArray'. Pouvez-vous faire quelque chose comme ça peut-être? : 'ArrayList msg = object.get (" Liste des sociétés ");' – TW80000

+0

Comment analysez-vous réellement la chaîne JSON? Votre méthode ne fait pas de véritable analyse - cela a déjà été fait lorsque vous avez créé cette instance initiale de 'JSONObject'. – Thomas

Répondre

0

JSON-simple (que vous semblez être en utilisant, bien que la version manque donc mon information pourrait être obsolète) crée normalement une instance de JSONArray (qui étend ArrayList btw.) Pour les tableaux dans les chaînes json, c'est-à-dire votre champ "Company List".

Cependant, vous êtes également en mesure de passer dans un ContainerFactory différent qui pourrait créer une instance List différente pour les tableaux de telle sorte que pourrait être la raison pour laquelle votre fonte ne fonctionne pas (encore une fois il y a trop peu d'informations dans votre question à d'autres observations sur cette).

Enfin, puisque vous devriez obtenir une List de toute façon il doit être sûr de jeter que:

List<?> msg = (List<?>) object.get("Company List"); 
0

Essayez JSONArray msg = object.getJSONArray("Company List"); au lieu de JSONArray msg = (JSONArray) object.get("Company List");

2

Jeté dans inst ArrayList ead de JSONArray (parce que peut être un JSONArray ou un ArrayList ou une mise en œuvre de la liste, il est dépend comment vous désérialiser votre chaîne: utilisez un ArrayList ou la liste d'interface vous assurer que vous ne peut pas avoir une exception class cast):

JSONObject parser = new JSONParser(); 
    JSONObject object = (JSONObject) parser.parse("{\n" + 
      " \"Name\": \"crunchify.com\",\n" + 
      " \"Author\": \"App Shah\",\n" + 
      " \"Company List\": [\n" + 
      "  \"Compnay: eBay\",\n" + 
      "  \"Compnay: Paypal\",\n" + 
      "  \"Compnay: Google\"\n" + 
      " ]\n" + 
      "}"); // Here there is a JSONArray for companies property 

    Map<String, Object> obj = new HashMap(); 
    List<String> companies = new ArrayList<>(); 
    companies.add("a"); 
    companies.add("b"); 
    companies.add("c"); 
    obj.put("Name", "toto"); 
    obj.put("Author", "titi"); 
    obj.put("Company List", companies); 
    JSONObject object2 = new JSONObject(obj); // here you have an ArrayList for companies property 

    String name = (String) object.get("Name"); 
    System.out.println(name); 

    String age = (String) object.get("Author"); 
    System.out.println(age); 

    //loop array 
    List msg = (List) object.get("Company List"); 
    Iterator<String> iterator = msg.iterator(); 
    while (iterator.hasNext()) { 
     System.out.println(iterator.next()); 
    } 
0

Vous utilisez org.json.simple qui a une interface différente.

Voici comment vous itérer sur la ArrayList

for(String s : object.get("Company List")) 
     System.out.println(s);