2012-05-14 3 views
2

Je reçois une chaîne JSON d'un service WCF, mais je reçois parfois des problèmes et parfois cela fonctionne très bien. C'est bizarre parce que les résultats qui sont retournés devraient être exactement les mêmes, mais parfois ça marche bien, et d'autres fois j'ai besoin de rafraîchir mon application plusieurs fois et ça marche très bien. Donc, je ne suis pas sûr s'il y a une inconstance avec quelque chose dans ma chaîne JSON ou si quelqu'un a des idées. Voici la chaîne JSON qui est retournéAndroid JSON chaîne non terminée au caractère

[{"AssmtStatus":1,"AssmtStatusText":null,"CreatedBy":"","IntervalDescr":null,"Status":0,"WoundLocation":null,"dtAssmtDate":"1\/1\/1900","dtLastCompleted":"3\/30\/2012 3:19:00 PM","iAssessmentID":1,"iAssessmentType":2,"sAssmtName":"Weekly Skin"},{"AssmtStatus":1,"AssmtStatusText":null,"CreatedBy":"","IntervalDescr":null,"Status":0,"WoundLocation":null,"dtAssmtDate":"1\/1\/1900","dtLastCompleted":"1\/1\/1900","iAssessmentID":1,"iAssessmentType":4,"sAssmtName":"Admission Skin"},{"AssmtStatus":1,"AssmtStatusText":null,"CreatedBy":"","IntervalDescr":null,"Status":0,"WoundLocation":null,"dtAssmtDate":"1\/1\/1900","dtLastCompleted":"1\/1\/1900","iAssessmentID":1,"iAssessmentType":5,"sAssmtName":"PHQ - 9 - Resident"},{"AssmtStatus":1,"AssmtStatusText":null,"CreatedBy":"","IntervalDescr":null,"Status":0,"WoundLocation":null,"dtAssmtDate":"1\/1\/1900","dtLastCompleted":"1\/1\/1900","iAssessmentID":1,"iAssessmentType":6,"sAssmtName":"PHQ - 9 - Staff"},{"AssmtStatus":1,"AssmtStatusText":null,"CreatedBy":"","IntervalDescr":null,"Status":0,"WoundLocation":null,"dtAssmtDate":"1\/1\/1900","dtLastCompleted":"1\/1\/1900","iAssessmentID":1,"iAssessmentType":7,"sAssmtName":"Brief Interview for Metal Status (BIMS)"},{"AssmtStatus":1,"AssmtStatusText":null,"CreatedBy":"","IntervalDescr":null,"Status":0,"WoundLocation":null,"dtAssmtDate":"1\/1\/1900","dtLastCompleted":"1\/1\/1900","iAssessmentID":1,"iAssessmentType":8,"sAssmtName":"Staff Assessment for Mental Status"},{"AssmtStatus":1,"AssmtStatusText":null,"CreatedBy":"","IntervalDescr":null,"Status":0,"WoundLocation":null,"dtAssmtDate":"1\/1\/1900","dtLastCompleted":"1\/1\/1900","iAssessmentID":1,"iAssessmentType":1001,"sAssmtName":"Open Note"},{"AssmtStatus":1,"AssmtStatusText":null,"CreatedBy":"","IntervalDescr":null,"Status":0,"WoundLocation":null,"dtAssmtDate":"1\/1\/1900","dtLastCompleted":"1\/1\/1900","iAssessmentID":1,"iAssessmentType":1002,"sAssmtName":"Labs Test"},{"AssmtStatus":1,"AssmtStatusText":null,"CreatedBy":"","IntervalDescr":null,"Status":0,"WoundLocation":null,"dtAssmtDate":"1\/1\/1900","dtLastCompleted":"1\/1\/1900","iAssessmentID":1,"iAssessmentType":1003,"sAssmtName":"Smoking Assessment"},{"AssmtStatus":1,"AssmtStatusText":null,"CreatedBy":"","IntervalDescr":null,"Status":0,"WoundLocation":null,"dtAssmtDate":"1\/1\/1900","dtLastCompleted":"5\/7\/2012 9:15:00 AM","iAssessmentID":1,"iAssessmentType":1004,"sAssmtName":"Inquiry Assessment"}] 

l'erreur que je reçois est « chaîne non terminée à caractère 2431 » si quelqu'un a des idées, je voudrais vraiment apprécier l'aide. merci

EDIT: Voici la classe entière que j'utilise pour obtenir le JSON.

private class GetAssmts extends AsyncTask<String,Void,Void>{ 
    private ProgressDialog Dialog = new ProgressDialog(AssmtSelectionUnScheduled.this); 

    protected void onPreExecute(){ 
     Dialog.setMessage("Loading.."); 
     Dialog.show(); 
    } 

    @Override 
    protected Void doInBackground(String... params) { 
     try { 
      HttpGet request = new HttpGet(SERVICE_URL + "/GetAssmtsUnScheduled/" + FacID + "/" + ResID + "/" + UserID); 
      request.setHeader("Accept", "application/json"); 
      request.setHeader("Content-type", "application/json"); 

      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpResponse response = httpClient.execute(request); 

      HttpEntity responseEntity = response.getEntity(); 

      // Read response data into buffer 
      char[] buffer = new char[(int)responseEntity.getContentLength()]; 
      InputStream stream = responseEntity.getContent(); 
      InputStreamReader reader = new InputStreamReader(stream); 
      reader.read(buffer); 
      stream.close(); 

      JSONArray plates = new JSONArray(new String(buffer)); 
      MyAssmts.clear(); 
      for (int i = 0; i < plates.length(); ++i) { 
       JSONObject jo = (JSONObject) plates.get(i); 
       Assmt myassmt = new Assmt(Integer.parseInt(jo.getString("iAssessmentType")),Integer.parseInt(jo.getString("iAssessmentID")),jo.getString("sAssmtName"),jo.getString("dtLastCompleted"), 
         Integer.parseInt(jo.getString("Status")),jo.getString("WoundLocation"),jo.getString("IntervalDescr"),jo.getString("CreatedBy"),Integer.parseInt(jo.getString("AssmtStatus")), 
         jo.getString("AssmtStatusText"),jo.getString("dtAssmtDate")); 
       MyAssmts.add(myassmt); 
      } 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    protected void onPostExecute(Void unused){ 
     Dialog.dismiss(); 
      final GridView lv = (GridView) AssmtSelectionUnScheduled.this.findViewById(R.id.gridView_AssmtList); 
      lv.setAdapter(new MyAdapter(AssmtSelectionUnScheduled.this, MyAssmts)); 
      lv.setOnItemClickListener(new OnItemClickListener() { 
       public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) { 
        Assmt sel = (Assmt) (lv.getItemAtPosition(arg2)); 
        boolean isNewAssmt = true; 
        if(sel.getsCreatedBy().length() > 0 && sel.getsCreatedBy().toUpperCase().equals(UserID.toUpperCase())){ 
         isNewAssmt = false; 
        } 
        launchAssmt(sel.getiAssessmentType(), sel.getiAssessmentID(), isNewAssmt, sel.getsAssmtDate()); 
       } 
      }); 
     } 
} 
+0

Votre JSON ne semble pas être mal formé. Vous pouvez le vérifier avec un vérificateur en ligne comme celui-ci: http://jsonviewer.stack.hu/ Comment obtenez-vous votre JSON et que faites-vous avec? Avez-vous des erreurs dans votre journal? Pourriez-vous ajouter du code ou le journal, s'il vous plaît? –

+0

à cette ligne JSONArray plates = new JSONArray (new String (buffer)); vous essayez de passer la chaîne comme JSON Array 1. cela fonctionne bien s'il n'y a pas d'espaces ex. [android, google, xml] 2. il va à travers l'erreur si votre chaîne/liste comme ça. Ex. [android, google, XML, virtusa Polaris, Amazon] –

Répondre

2

Je dirais que responseEntity.getContentLength() ne retourne pas la bonne valeur, de sorte que votre tampon de caractères finit par être trop petit.

7

J'ai eu la même erreur, mais j'ai découvert que reader.read(buffer) n'a pas tout lu. Vous pouvez faire une boucle jusqu'à ce que vous ayez tout, comme ceci:

int contentLength = (int) responseEntity.getContentLength(); 
char[] buffer = new char[contentLength]; 
InputStream stream = responseEntity.getContent(); 
InputStreamReader reader = new InputStreamReader(stream); 

int hasRead = 0; 
while (hasRead < contentLength) 
    hasRead += reader.read(buffer, hasRead, contentLength-hasRead); 

stream.close(); 
Questions connexes