2016-08-29 2 views
0

3 가지 가능한 변형을 가진 REST API를 구문 분석하려고합니다. 첫 번째 것은 이미 아래에있는 사진과 같이 "행"출력을위한 배열이있는 곳에서 이미 작동하는 것입니다. 아래 그림과 같이안드로이드에서 3 가지 가능한 변형으로 REST API를 파싱하는 방법

enter image description here

또한, 물체가 로우로된다.

enter image description here

마지막으로, 다음과 같이 데이터가없는 하나. enter image description here

이들 중 하나는 API를 구문 분석 할 때 가능한 출력이며, 출력이 무엇인지 확인하고 if에서 정보를 구문 분석하는 if 문과 같은 것이 필요하지만 if를 작성하는 방법을 모르겠습니다. 이 특별한 필요에 대한 진술. 여기에 내 현재 코드가있다 :

JSONObject parentObject = new JSONObject(finalJson); 

        JSONObject responseJSON = JSONUtils.jsonObjectFromJSONForKey(parentObject, "response"); 
        if (responseJSON != null) { 
          JSONObject resultJSON = JSONUtils.jsonObjectFromJSONForKey(responseJSON, "result"); 
          JSONObject contactsJSON = JSONUtils.jsonObjectFromJSONForKey(resultJSON, "Potentials"); 
          JSONArray parentArray = contactsJSON.getJSONArray("row"); 


          List<Photoshoots> photoshootsList = new ArrayList<>(); 
          for (int i = 0; i < parentArray.length(); i++) { 
           JSONObject mainObject = parentArray.getJSONObject(i); 
           JSONArray mainArray = mainObject.getJSONArray("FL"); 
           Photoshoots photoshoot = new Photoshoots(); 

... 
+0

내 생각에 이것은 잘못된 디자인입니다. 항상 동일한 구조체 (이 경우 배열)를 반환해야합니다. 이것은 배열 일 수 있습니다. 1 또는 2의 배열 또는 빈 배열 –

+0

ScaryWombat의 정서에 동의합니다. 결과를 단일 객체로 파싱합니다. "nodata"가 있는지 또는 "행"인지 확인하십시오.아니요 "또는 무엇이든, 그 다음 나머지 부분을 처리 할 수 ​​있고, 더 많은 것을 대표 할 수 있습니다. 하루가 끝날 때 가지고있는 정보는 0 개 이상의 결과 객체와 선택적인 설명 메시지/코드로 종결됩니다. - 배열과 어쩌면 문자열 - 비즈니스 로직을 * 수행하십시오. * Btw는 설계하고 수정 한 API입니까? –

답변

0

나는 문제를 해결했다. 문제를 해결하는 이상적인 방법은 아니지만 작동합니다. AsyncTask의 doInBackground 내부에서 JSON 결과 데이터를 StringBuffer로 변환 한 다음 StringBuffer를 String으로 변환했습니다. 그런 다음 하나의 if 문과 2 else if 문을 사용하여 데이터를 구문 분석했습니다. 문 체크 JSON 문자열이 문구 데이터가 아래와 같이 내 원래의 기준을 일치 없다는 것을 나타내는 "NODATA"를 포함하는 경우이 경우 첫 번째 :

if (finalJson.contains("nodata")) 

그때는 널 (null) 데이터를 전달했다가 나중에 onPostExecute에서 확인할 수있다. 다음 else if 문이 행이 배열인지 확인합니다. 다음과 같이 내가 그 정보를 분석

else if (finalJson.contains("{\"response\":{\"result\":{\"Potentials\":{\"row\":[")) 

: : 문자열이 [후 행이 있다면 나는 그 확인했다 않았다 방법은 다음과 같이 배열을 것을 나타내는 볼 수

JSONArray parentArray = contactsJSON.getJSONArray("row"); 


         for (int i = 0; i < parentArray.length(); i++) { 
          JSONObject mainObject = parentArray.getJSONObject(i); 
          JSONArray mainArray = mainObject.getJSONArray("FL"); 

다음

else if (finalJson.contains("{\"response\":{\"result\":{\"Potentials\":{\"row\":{")) 

I를 아래 그림과 같이 아마 그냥 다른 문이 될 수있는 경우 다른 최종은, 그냥 객체이었다 나타내는 대신에 [행 후 {찾고 제외하고는 거의 동일합니다 파문의 일 전자 정보는 다음과 같이 다음 onPostExecute의 내부

JSONObject mainObject = contactsJSON.getJSONObject("row"); 
          JSONArray mainArray = mainObject.getJSONArray("FL"); 

, 나는 그 밖의 경우 문 모두 포함 된 결과를 ArrayAdapter와를 확장하는 클래스를 실행하는 코드를 가지고,하지만 난 그것을 실행하지 않으 NODATA있는 경우

protected void onPostExecute(List<Photoshoots> result) { 
       super.onPostExecute(result); 



       if (result != null) { 
    PhotoshootAdapter adapter = new PhotoshootAdapter(getApplicationContext(), R.layout.row, result); 
        lvPhotoshoots.setAdapter(adapter);} 

else{ 
    new CountDownTimer(60000, 1000) { 

         public void onTick(long millisUntilFinished) { 
          btnRefresh.setText("No Data to Show. Try again in " + millisUntilFinished/1000 + " Seconds"); 
         } 

         public void onFinish() { 
          btnRefresh.setText("Refresh"); 
          btnRefresh.setEnabled(true); 
         } 
        }.start(); 

결과는 널 (null) 데이터를 전달하지만, 결과 내 데이터가있을 경우 목록 : 데이터가없는 경우, 그래서 나는 다음을했다. 말했듯이,이 문제를 해결하는 더 좋은 방법이있을 수 있지만 응용 프로그램이 지금 작동하고 반환 된 데이터에 관계없이 충돌하지 않습니다.

+0

더 많은 정보를 추가하거나 문제 나 질문에 대해 자세히 설명하고 있다면 질문을 대답으로 게시하는 대신 편집하여 –

관련 문제