2012-03-30 1 views
0

안녕하세요 Android 프로그래머,이상한 JSON (논리) 오류?

내 응용 프로그램에서 웹 사이트를 구문 분석하고 있습니다. https://raw.github.com/currencybot/open-exchange-rates/master/latest.json

이 코드 세그먼트의 문제는 순서의 요금 을 받고되지 않는 것입니다 :

는 웹 사이트입니다. 그것은 ArrayList에 최초의 속도이기 때문에, (당신이 웹 사이트를 보면)

test.setText(currency_values.get(0).toString()); //test is a TextView 

대답은 3.6733해야한다 :

private class DownloadWebPageTask extends AsyncTask<String, Void, ArrayList<Double>> 
{ 
    protected ArrayList<Double> doInBackground(String... urls) 
    { 
     ArrayList<Double> response = new ArrayList<Double>(); 
     for (String url : urls) 
     { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try 
      { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 
       InputStreamReader isr = new InputStreamReader(content); 
       StringBuilder sb = new StringBuilder(); 
       char[] buffer = new char[1024]; 
       while (isr.read(buffer) != -1) 
       { 
        sb.append(buffer); 
       } 
       JSONObject jobj = new JSONObject(sb.toString()); 
       JSONObject ratesObj = jobj.getJSONObject("rates"); 
       Iterator<String> keys = ratesObj.keys(); 
       while (keys.hasNext()) 
       { 
        response.add(Double.parseDouble(ratesObj.getString(keys.next()))); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 
    @Override 
    protected void onPostExecute(ArrayList<Double> result) 
    { 
     currency_values = result; 
    } 

이 클래스를 테스트하기 위해, 나는 다음 코드 줄을 사용 . 그러나 나중에 82.894997을 반환하는데 이는 JPY에서 찾을 수 있습니다.

왜 이런 일이 발생합니까? 누구든지이 문제를 해결할 수 있습니까?

답변

0

JSONObject는 아마도 필드/값 조합을 저장하기 위해 단순한 Map (정렬 된 것이 아닌)을 사용하고 있기 때문일 것입니다. 해결책은 JSON을 실제로 업데이트하는 것입니다. 문제는 일정 비율의 요금을 원한다는 것입니다. 이처럼 : 결과를 정렬하려면 문자열 필드와 두 번을 가진 객체에 먼저 저장 :

편집
{ "key": "AED", 
    "value": 3.6733 
} 

이 : 사실

"rates": [ 
    { "AED": 3.6733 }, 
    {"AFN": 48.32}, 
    {"ALL": 104.959999}, 
    ... 
] 

, 내가 거짓말, 속도는 다음과 같이한다 입력란에 이름순으로 정렬하고 순서대로 표시 할 수 있습니다. 당신은 안드로이드 설명서에 보면

+0

그래서이 json 파일을 Android의 원시 폴더에 저장 한 다음 수정하여 편집하십시오. 왜냐하면 이건 내 아들이 아니야. 다른 사용자가 나를이 사이트로 이동 시켰습니다 :) – sameetandpotatoes

+0

감사합니다. dmon을 업데이트 해 주셔서 감사합니다. JSON을 어떻게 업데이트합니까? – sameetandpotatoes

+0

글쎄, 당신이 JSON을 제어한다고 가정했는데, 그렇지 않다면 정렬되지 않은 형식을 정렬 할 수있는 모델로 수동으로 변환해야 할 것입니다. – dmon

0

, 그것은 말한다 :

이 객체의 문자열 이름의 반복자를 돌려줍니다. 반환 된 반복자는 제거를 지원하므로 해당 객체에서 해당 매핑 을 제거합니다. 반복기가 이 반환 된 후에이 개체가 수정되면 반복기의 동작은 정의되지 않습니다. 키의 순서는 정의되지 않습니다.

따라서 다른 방법을 사용해야합니다. 아마도 JSONObject.names()을 사용해 보시겠습니까? 또는 배열에 모든 키 - 값 쌍을 추가 한 다음 정렬하고 해당 순서를 사용하십시오. 단순한 알파벳순 정렬 인 것처럼 보입니다.

+0

Android 설명서를 알려 주셔서 감사합니다. 먼저 파일을 사용하고 싶지 않기 때문에 먼저 말한 것을 시도해 보겠습니다. 웹에 액세스하기를 원합니다. – sameetandpotatoes