2016-08-10 3 views
0

회사 목록을 인쇄하려고합니다.JSON 배열 구문 분석

내 JSON 개체 :

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

코드 :

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()); 
     }  
    } 
} 

오류 :

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

그냥 보조 노트 : 프로덕션으로 코드를 삽입하기 전에 당신이 당신의 이름을 리팩토링해야한다. ;) -'String age = (String) object.get ("Author");'... – Thomas

+1

오류 메시지에서 오른쪽 :'ArrayList'를'JSONArray'에 캐스트 할 수 없습니다. 이걸 어쩌면 할 수 있니? :'ArrayList msg = object.get ("Company List");' – TW80000

+0

실제로 json 문자열을 어떻게 파싱하고 있습니까? 당신의 메소드는 실제 구문 분석을하지 않습니다. 이것은 초기 JSONObject 인스턴스를 생성 할 때 이미 완료되었습니다. – Thomas

답변

0

JSON - 간단한 ArrayList btw.), 즉 "Company List" 필드와 같이 json 문자열에있는 배열의 경우.

ContainerFactory하지만 배열에 다른 List 인스턴스가 생성 될 수 있으므로 전달할 수 있습니다. 캐스트가 작동하지 않는 이유가 될 수 있습니다. (질문에 너무 적어서 더 이상 설명 할 수 없습니다. 그). 당신은 어떻게라도 List을 받아야하기 때문에

마지막으로, 그 캐스팅하는 것이 안전해야한다 :

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

는 ArrayList를 이달에 대신 JSONArray msg = (JSONArray) object.get("Company List");

2

캐스트의 JSONArray msg = object.getJSONArray("Company List"); 시도

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
: JSONArray의 EAD의 (a JSONArray 또는 ArrayList에 또는 그것의 목록의 구현이 될 수 있기 때문에 당신이 당신의 문자열이 너무 클래스 캐스트 예외를 가질 수 없습니다 당신을 위해 ArrayList에 또는 인터페이스 목록을 사용하여 직렬화하는 방법 따라 다름)

다른 인터페이스를 사용하는 org.json.simple을 사용 중입니다. 여기

는 반복하는 방법이다 ArrayList

일반적으로 확장 JSONArray의 인스턴스를 (생성 (당신은 버전이 나의 정보가 오래된 될 수없는 있지만 사용하는 것 같다있는)
for(String s : object.get("Company List")) 
     System.out.println(s);