Каков наиболее эффективный способ разобрать ответ JSON с сервера, который возвращается как одна огромная линия? Я не хочу/должен «сопоставлять» этот JSON с некоторыми пользовательскими/бизнес-объектами, поскольку мне нужны только определенные части структуры.
В основном поиск определенного тега и его значений среди множества массивов.Лучший способ обработки огромного ответа HTTP JSON
UPDATE:
Ищу эффективный способ для разбора ответ JSON с внутреннего сервера.
Ответ отправляется как огромная одна строка. Файл настолько велик, что пытаться понять структуру с помощью json-плагина Брауэра все еще сложно, поскольку браузер «застрял».
Для моих нужд я хочу определенные бит информации и не хочу сопоставлять JSON с фактическим бизнес-объектом/классами, поскольку это будет слишком много ненужной работы. Что я в настоящее время сделать для тестирования на это (я удалил обработку исключений для ясности):
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = null;
response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
StringBuilder builder = null;
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
if (builder.length() != 0) {
processJSON(builder.toString());
}
return builder.toString();
}
private void processJSON(String s) {
JSONObject o = new JSONObject(s);
String url = (String) o.get("url");
JSONArray array = o.getJSONArray("individualroles");
for(int i = 0; i < array.length(); i++) {
JSONObject elem = (JSONObject) array.get(i);
String fullNameForDisplay = (String) elem.get("fullName");
String status = (String) elem.get("status");
String date = (String) elem.get("date");
String fullDescription = (String) elem.get("full_description").toString();
JSONArray contacts = (JSONArray) elem.get("contacts");
for(int j = 0; j < contacts.length(); j ++) {
JSONObject contact = (JSONObject) contacts.get(j);
String contactName = contact.getString("contactName");
String displayName = contact.getString("displayName");
String realAddress = contact.getString("realAddress");
Log.i(“MyApp”, “contactName = “ + contactName + “ displayName = “ + displayName + “ readAddress = “ + realAddress);
}
}
Это буквально fluds журнала как ответ JSON т.е. String s
имеет длину символов ~ 7million.
Кроме того, я вижу в журнале многих утверждений типа:
I/искусство: Фон липкая одновременно знак развертка GC освободила 389 (14kb) AllocSpace объектов, 3 объекта (851KB) Лось, 0% бесплатно, 2MB/2MB, приостановленный 30.651ms всего 77.127ms
Для тестирования это то, что я сделал то, что в я делаю осколком onCreate
:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Log.i(“MyApp”, (new JSONParser().get(JSON_URL_SERVER)));
}
});
thread.start();
есть ли какие-либо проблемы, например, с памятью и GC с таким подходом? Как я могу улучшить это?
Вы можете использовать Джексон и его потокового API, например – fge
http://stackoverflow.com/questions/29272990/get-selected-items-data-in-listview-fetched-from-json/29273258#29273258 – Yogendra
HTTP : //developer.android.com/reference/android/util/JsonReader.html http://www.androidhive.info/2014/09/android-json-parsing-using-volley/ – Yogendra