2015-07-28 2 views
-1

Il y a d'autres réponses à cette question ici mais je ne sais pas comment les faire fonctionner avec mon code. J'ai beaucoup de JSON à transmettre, donc j'ai besoin de le diffuser plutôt que de le faire en une seule fois. Je n'arrive pas à extraire les erreurs du code. Voici mon code:Prévoir une chaîne mais BEGIN_OBJECT: JsonReader

HttpGet request = new HttpGet(getUri + "&" 
       + credentials.getOauthStructure()); 
     HttpResponse response = client.execute(request); 

     ICustomerDAO customerDAO = (ICustomerDAO) DAOFactory.getDAO(
       ICustomerDAO.class.getName(), context); 
     customerDAO.open(); 

     Gson gson = new GsonBuilder().serializeNulls() 
       .excludeFieldsWithoutExposeAnnotation().create(); 

     Reader streamReader = new InputStreamReader(response 
       .getEntity().getContent()); 
     JsonReader reader = new JsonReader(streamReader); 
     reader.beginArray(); 

     while (reader.hasNext()) { 
      //Do the JSON parsing and data saving here 
      Customer customer = gson.fromJson(reader.nextString(), Customer.class);<-----error here 
      customerDAO.saveCustomer(customer); 
     } 
     reader.endArray(); 
     reader.close(); 
     customerDAO.close(); 

Je reçois l'erreur:

attendant une chaîne, mais était BEGIN_OBJECT:

Sur la ligne marquée dans le code ci-dessus.

EDIT: La valeur du "lecteur" est "JsonReader près de [{" Action ": null". Adr » Donc, cela semble être coupé près du début de la JSON

je. pour obtenir le JSON comme ceci:

HttpGet request = new HttpGet(getUri + "&" 
       + credentials.getOauthStructure()); 
     String content = client.execute(request, new BasicResponseHandler()); 

Mais il est revenu une grande quantité de JSON tellement changé à la façon dont je l'utilise actuellement, pour tenter de le diffuser

.

Edit 2: Mon code original était:

public class CustomerSync implements ICustomerSync { 
    public static final int QUANTITY = 0; 
    private long offset; 
    private ProgressDialog progressDialog; 
    private Context context; 
    private HttpClient client; 
    private final String HTTPS_GET_CUSTOMERS = "https://plcloud.c6.ixsecure.com/PLService.svc/GetCustomers"; 
    private final String GET_URL = "{0}?quant={1}&offset={2}"; 
    private final String HTTPS_SYNC_CUSTOMERS = "https://plcloud.c6.ixsecure.com/PLService.svc/SyncCustomers"; 

    private CustomerSync() { 
     client = new DefaultHttpClient(); 
    } 

    public CustomerSync(Context context, ProgressDialog progressDialog) { 
     this(); 
     this.context = context; 
     this.progressDialog = progressDialog; 
    } 

    public Customer[] initCustomersFromJson(Credentials credentials) 
      throws ClientProtocolException, IOException, URISyntaxException { 
     String getUri; 
     getUri = MessageFormat.format(GET_URL, HTTPS_GET_CUSTOMERS, 
       QUANTITY + "", offset + ""); 

     credentials.initGetOAuthStructure(HTTPS_GET_CUSTOMERS); 

     HttpGet request = new HttpGet(getUri + "&" 
       + credentials.getOauthStructure()); 
     String content = client.execute(request, new BasicResponseHandler()); 

     Gson gson = new GsonBuilder().serializeNulls() 
       .excludeFieldsWithoutExposeAnnotation().create(); 
     return gson.fromJson(content, Customer[].class); 
    } 

    @Override 
    public void getCustomers(Credentials credentials) 
      throws ClientProtocolException, IOException, URISyntaxException { 
     ICustomerDAO customerDAO = (ICustomerDAO) DAOFactory.getDAO(
       ICustomerDAO.class.getName(), context); 
     customerDAO.open(); 

     Customer[] customers; 

     //do { 
      customers = initCustomersFromJson(credentials); 
      progressDialog.setMax(customers.length); 
      progressDialog.setProgress(0); 
      customerDAO.saveCustomers(customers, progressDialog); 

      if (customers.length > 0) { 
       offset = customers[customers.length - 1].getId(); 
      } 
     //} while (customers.length > 0); 

     customerDAO.close(); 

     Settings.getInstance().setLastSyncCustomerDatetime(new Date()); 
    } 

Mais cela n'a pas flux les données il a causé des problèmes de mémoire.

+0

S'il vous plaît nous montrer le 'client 'classe avec le JSON que vous essayez d'analyser. L'erreur se produit probablement parce que le client ne reflète pas avec précision le format JSON –

+0

Imprimer ce que 'lecteur.nextString()' vous donne –

+0

utiliser 'nextObject()' – njzk2

Répondre

0

La méthode recommandée pour faire votre demande http est la suivante:

URL url = new URL(sUrl); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 


String sResult = null; 
InputStream in = new BufferedInputStream(conn.getInputStream()); 
BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
try 
{ 
    StringBuilder out = new StringBuilder(); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     out.append(line); 
    } 
    sResult = out.toString(); 
} 
finally 
{ 
    // Do cleanup 
    try{ 
     in.close(); 
     reader.close(); 
    } catch (IOException e) { 
     Log.wtf(AsyncRestHelper.class.getSimpleName(), "Could not close Input Stream!"); 
     e.printStackTrace(); 
    } 
} 

Vous pouvez ensuite utiliser sResult pour analyser en Customers avec GSON que vous faites actuellement

+0

A bientôt, j'ai le JSON dans sResult maintenant. Cependant, maintenant, au stade de l'analyse, suggérez-vous que je le fasse de la façon dont j'ai posté dans mon «EDIT 2»? Parce que cela cause des problèmes de mémoire. – BeniaminoBaggins

+0

@ user3935156 Vous avez le JSON dans 'sResult', en utilisant quoi? en utilisant la méthode de @Cigogne? – Darpan

+0

Comment cela provoque-t-il des problèmes de mémoire? Pouvez-vous poster l'erreur exacte? Jetons un coup d'oeil à votre chaîne JSON –