2011-06-10 6 views
7

JSON 구문 분석은 여기에 대한 토론의 꽤 일반적인 주제 인 것처럼 보입니다. 나는 주변을 둘러 보았고 아직도 내가 찾고있는 것을 발견하지 못했습니다. 는 여기가 서버에 JSON 요청을 보내도록 HttpClient를 사용하고 내 HttpClient를android에서 JSON 문자열 구문 분석

public class CreateJsonRequest { 


    public static String SendJsonRequest(String URL, Map<String,Object> params){ 
      try{ 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(URL); 

       JSONObject holder = new JSONObject(); 

       for (Map.Entry<String, Object> m : params.entrySet()){ 
        try { 
         holder.put(m.getKey(), m.getValue()); 
        } 
        catch (JSONException e) { 
         Log.e("Hmmmm", "JSONException : "+e); 
        } 
       } 
       StringEntity se; 
       se = new StringEntity(holder.toString()); 

       httpPost.setEntity(se); 
       httpPost.setHeader("Accept", "text/json"); 
       httpPost.setHeader("Content-type", "text/json"); 

       HttpResponse response = httpClient.execute(httpPost); 
       HttpEntity entity = response.getEntity(); 

       if(entity != null){ 
        final JSONObject respObject = new JSONObject(EntityUtils.toString(entity)); 
        String result = respObject.toString();  
        parseJSON(result); 

내 코드입니다. 그런 다음 서버는 JSON에서 응답을 반환합니다. 이것은 잘 작동합니다. 이제 여기 내가 곤경에 처해있는 곳입니다. 서버에서 HttpEntity를 받았습니다. 나는 이것을 다음과 같은 문자열로 바꾸고있다. {"Make":"Ford","Year": 1975, "Model":"Mustang"}이 문자열을 내 parseJSON(String jString) 메서드에 보낼 수있게하려면 키 값 맵을 반환합니다. 필자가 다른 게시물과 다른 점은 parse 메소드가 보낼 JSON 문자열의 키 값 맵을 만들 수 있기를 원한다는 점이다. 그래서 만약 내가 그것을 {"Engine":"v8","Cylinders": 8, "Transmission":"Manual","Gears": 4} 보냈 더라면 여전히 작동 할 것이다. 이게 가능합니까? 그렇다면 올바른 방향으로 조금 움직여 주시겠습니까?

+0

Google의 GSON 라이브러리를 사용해보세요. – binnyb

+0

이것은 'Android'가 아닙니다. 맞습니까? 또는 나는 무엇인가 놓치고 있냐? 그것은 당신이 안드로이드 애플 리케이션에서 사용하는 것은 완전히 무관 한 것처럼 보입니다. – keyser

답변

20

이 경우 JSONObject 클래스의 keys 메서드를 사용할 수 있습니다. 그것은 기본적으로 당신이 다음 얻고 맵의 값을 넣어 반복 할 수있는, 키의 Iterator를 반환합니다 : Jackson 아주 간단하게 두 JSON 예제 중 하나를 역 직렬화 할 수

try { 
    JSONObject jsonObject = new JSONObject(theJsonString); 
    Iterator keys = jsonObject.keys(); 
    Map<String, String> map = new HashMap<String, String>(); 
    while (keys.hasNext()) { 
     String key = (String) keys.next(); 
     map.put(key, jsonObject.getString(key)); 
    } 
    System.out.println(map);// this map will contain your json stuff 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 
+0

아 ... 나는 그것에 대해서 생각조차하지 않았다. 내가 본 모든 예제는 알려진 키를 사용하고있었습니다. 나는 그것을 조금만 시도 할 것이다. 감사! –

+0

완벽하게 일했습니다. 고맙습니다. –

+0

@ michaelw2608 - upvote로 그에게 고마워요 ... – tpow

1

참고. 당신이 Map<String, String>에 만족하는 경우

ObjectMapper mapper = new ObjectMapper(); 
Map<String, Object> values = mapper.readValue(theJsonString, Map.class); 

Gson 대신 Map<String, Object>의, 단순히 유사 그것을 할 수 있습니다. 현재 Gson은 Map<String, Object>에 대해 사용자 지정 deserialization이 필요합니다.