这里有这个问题的其他一些答案,但不确定如何让它们使用我的代码。
我有很多 JSON 要传递,所以我需要流式传输它而不是一次全部完成。我无法完全从代码中找出错误。这是我的代码:
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();
我得到错误:
期待一个字符串,但是是 BEGIN_OBJECT:
在上面代码中的标记行上。
编辑:“阅读器”的值是“[{“Action”:null,“Addr”附近的“JsonReader”。所以似乎在 JSON 开头附近被切断。
我曾经像这样获取JSON:
HttpGet request = new HttpGet(getUri + "&"
+ credentials.getOauthStructure());
String content = client.execute(request, new BasicResponseHandler());
但它返回了大量的 json,因此将其更改为我目前使用的方式,以尝试对其进行流式传输。
编辑2:我的原始代码是:
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());
}
但这并没有流式传输数据,因此导致了内存问题。