Парсинг url в невалидном формате json
Парсинг url в невалидном формате json
Добрый вечер!
Стала задача запарсить имена ста самых закачиваемых приложений в iTunesStore в формате json и записать их в бд. Ресурс:
https://itunes.apple.com/br/rss/topfree ... t=100/json
Я пробовал парсить как массив, но постоянно вылетает на 115-ой char (Error parsing data org.json.JSONException: Unterminated array at character 115 of). На stackoverflow подсказали проверить на валидность и оказалось что это и не массив вовсе...
Задача: получить имена этих приложений. Пример ключа/значения из источника {"im:name":{"label":"WhatsApp Messenger"}.
Пожалуйста, подскажите как это сделать? С Json раньше не сталкивался и целый день сижу, ломаю голову...
Для лучшего понимая, лучше заглянуть в источник.
Буду очень благодарен за любой совет, любую подсказку!!
Стала задача запарсить имена ста самых закачиваемых приложений в iTunesStore в формате json и записать их в бд. Ресурс:
https://itunes.apple.com/br/rss/topfree ... t=100/json
Я пробовал парсить как массив, но постоянно вылетает на 115-ой char (Error parsing data org.json.JSONException: Unterminated array at character 115 of). На stackoverflow подсказали проверить на валидность и оказалось что это и не массив вовсе...
Задача: получить имена этих приложений. Пример ключа/значения из источника {"im:name":{"label":"WhatsApp Messenger"}.
Пожалуйста, подскажите как это сделать? С Json раньше не сталкивался и целый день сижу, ломаю голову...
Для лучшего понимая, лучше заглянуть в источник.
Буду очень благодарен за любой совет, любую подсказку!!
Re: Парсинг url в невалидном формате json
json по ссылке абсолютно валидный, и это действительно не массив. Вам нужно работать с ним как с json. Что тут еще можно подсказать? сотни книг написанно и всяких руководств в сети. к примеру: http://stackoverflow.com/a/9606629

Re: Парсинг url в невалидном формате json
Это всё верно, но когда я получаю объект json я застряю на 115-м символе.... то есть в самом начале...
вот лог:
и что бы я не менял, далее, оно застряет ещё на объекте... пробовал этим же обычным JsonParser-ом другой источник - всё работает на ура...
вот лог:
Код: Выделить всё
09-10 20:04:03.013 18211-18241/com.yuretsrodik.top100apps E/JsonParser.java﹕ Error parsing data org.json.JSONException: Unterminated array at character 115 of {"feed":{"author":{"name":{"label":"iTunes Store"}, "uri":{"label":"http://www.apple.com/br/itunes/"}}, "entry":[n{"im:name":{"label":"Messenger"}, "im:image":[n{"label":"http://a474.phobos.apple.com/us/r30/Purple4/v4/78/1f/f9/781ff9ea-bf94-5309-4c32-4b901279e54a/mzl.rairyzma.53x53-50.png", "attributes":{"height":"53"}}, n{"label":"http://a990.phobos.apple.com/us/r30/Purple4/v4/78/1f/f9/781ff9ea-bf94-5309-4c32-4b901279e54a/mzl.rairyzma.75x75-65.png", "attributes":{"height":"75"}}, n{"label":"http://a1675.phobos.apple.com/us/r30/Purple4/v4/78/1f/f9/781ff9ea-bf94-5309-4c32-4b901279e54a/mzl.rairyzma.100x100-75.png", "attributes":{"height":"100"}}], "summary":{"label":"lcance instantaneamente as pessoas na sua vida, gratuitamente. O Messenger é como mensagens de texto, mas você não precisa pagar por cada mensagem (funciona com o seu plano de dados). \n\nNão é só para amigos no Facebook: envie mensagens para as pessoas na sua agenda de contatos e basta inserir um número de telefone para adicionar um novo contato.\n\nBate-papos em grupo: crie grupos para as pessoas a quem você mais envia mensagens. Dê um nome a eles, defina fotos para o grupo e os mantenha em um só lugar.\n\nFotos e vÃdeos: grave vÃdeos e tire selfies ou outras fotos diretamente do aplicativo e envie-os com um toque.\n\nLigações gratuitas: fale por quanto tempo quiser, mesmo com pessoas em outros paÃses. (Ligações são gratuitas somente através do Wi-Fi. Do contrário, cobranças de dados padrão são aplicáveis).\n\nMais formas de enviar mensagens: \nDê vida à s suas conversas com as figurinhas. \nVeja uma prévia das suas fotos e vÃdeos no rolo da câmera sem sair da conversa, e escolha as melhores para enviar.\nGrave mensagens de voz quando tiver mais para dizer\n\nRecursos adicionais:\nSaiba quando as pessoas viram suas mensagens.\nEncaminhe mensagens ou fotos para as pessoas que não estavam na conversa.\nProcure pessoas e grupos para entrar em contato com eles rapidamente.\nAtive a localização para que as pessoas saibam que você está nas imediações.\nVeja quem está disponÃvel no Messenger e quem está on-line no Facebook. \nDesative as notificações quando você estiver trabalhando, dormindo ou se precisar dar um tempo.\nFique conectado para nunca perder uma mensagem."}, "im:price":{"label":"Grátis", "attributes":{"amount":"0.00000", "currency":"USD"}}, "im:contentType":{"attributes":{"term":"Application", "label":"Aplicativo"}}, "rights":{"label":"© Facebook, Inc."}, "title":{"label":"Messenger - Facebook, Inc."}, "link":{"attributes":{"rel":"alternate", "type":"text/html", "href":"https://itunes.apple.com/br/app/messenger/id454638411?mt=8&uo=2"}}, "id":{"label":"https://itunes.apple.com/br/app/messenger/id454638411?mt=8&uo=2", "attributes":{"im:id":"454638411", "im:bundleId":"com.facebook.Messenger"}}, "im:artist":{"label":"Facebook, Inc.", "attributes":{"href":"https://itunes.apple.com/br/artist/facebook-inc./id284882218?mt=8&uo=2"}}, "category":{"attributes":{"im:id":"6005", "term":"Social Networking", "scheme":"https://itunes.apple.com/br/genre/ios-redes-sociais/id6005?mt=8&uo=2", "label":"Redes sociais"}}, "im:releaseDate":{"label":"2011-10-19T15:39:30-07:00", "attributes":{"label":"19/10/2011"}}}, n{"im:name":{"label":"WhatsApp Messenger"}, "im:image":[n{"label":"http://a1554.phobos.apple.com/us/r30/Purple1/v4/1f/94/ff/1f94ffd9-159e-a247-2c0f-059f86b6c6c9/mzl.ivmblqpq.53x53-50.png", "attributes":{"height":"53"}}, n{"label":"http://a422.phobos.apple.com/us/r30/Purple1/v4/1f/94/ff/1f94ffd9-159e-a247-2c0f-059f86b6c6c9/mzl.ivmblqpq.75x75-65.png", "attributes":{"height":"75"}}, n{"label":"http://a1251.phobos.apple.com/us/r30/Purple1/v4/1f/94/ff/1f94ffd9-159e-a247-2c0f-059f86b6c6c9/mzl.ivmblqpq.100x100-75.png", "attributes":{"height":"100"}}], "summary":{"label":"O WhatsApp Messenger é um mensageiro para smartphone
09-10 20:04:03.013 18211-18241/com.yuretsrodik.top100apps W/dalvikvm﹕ threadid=11: thread exiting with uncaught exception (group=0x42044e48)
09-10 20:04:03.023 18211-18241/com.yuretsrodik.top100apps E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: com.yuretsrodik.top100apps, PID: 18211
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.NullPointerException
at com.yuretsrodik.top100apps.AsyncTaskParseJson.doInBackground(AsyncTaskParseJson.java:32)
at com.yuretsrodik.top100apps.AsyncTaskParseJson.doInBackground(AsyncTaskParseJson.java:10)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)Re: Парсинг url в невалидном формате json
Выяснил, что проще всего получить объект вот так
Но как оттуда достать имена??
Это видит и выдаёт, а вот если пытаюсь дальше вглубь уже не видит!
Пожалуйста, помогите, голова сейчас взорвётся...
Код: Выделить всё
JSONObject json = new JSONObject(EntityUtils.toString(new DefaultHttpClient().execute(new HttpGet(url)).getEntity()));Код: Выделить всё
String str = json.getString("feed"); // корневой элемент Код: Выделить всё
String str = json.getString("entry");Пожалуйста, помогите, голова сейчас взорвётся...
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Парсинг url в невалидном формате json
Так вы не обращайтесь к объекту как String, когда он JsonObject. entry - это тоже JsonObject, так и получайте его как Json.
JSONObject feed = json.getJSONObject(feed");
JSONArray massiveEntry = feed .getJSONArray("entry");
JSONObject feed = json.getJSONObject(feed");
JSONArray massiveEntry = feed .getJSONArray("entry");
Re: Парсинг url в невалидном формате json
Как вам уже сказали выше entry - это не строка, а массив( JsonArray ) содержащий в себе json объекты.Yurets писал(а):Выяснил, что проще всего получить объект вот такНо как оттуда достать имена??Код: Выделить всё
JSONObject json = new JSONObject(EntityUtils.toString(new DefaultHttpClient().execute(new HttpGet(url)).getEntity()));Это видит и выдаёт, а вот если пытаюсь дальше вглубьКод: Выделить всё
String str = json.getString("feed"); // корневой элементуже не видит!Код: Выделить всё
String str = json.getString("entry");
Пожалуйста, помогите, голова сейчас взорвётся...



Re: Парсинг url в невалидном формате json
Да, да, я с этим уже разобрался, нашёл где структуру посмотреть... Спасибо, Mikhail_dev.
Сейчас пытаюсь всё вышесказанное воплотить.
Сейчас пытаюсь всё вышесказанное воплотить.
Re: Парсинг url в невалидном формате json
УРААА! Заработало! 
Вот полный код метода doInBackground, вдруг кому-то пригодиться
Спасибо за помощь! Правильная подсказка в нужный момент просто жизнь спасла!!
Вот полный код метода doInBackground, вдруг кому-то пригодиться
Код: Выделить всё
@Override
protected Boolean doInBackground(Void... params) {
Log.d(LOG, "Do in background");
ContentValues cv = new ContentValues();
try {
JSONObject json = new JSONObject(EntityUtils.toString(
new DefaultHttpClient().execute(
new HttpGet(url)).getEntity()));
JSONObject feedObject = json.getJSONObject("feed");
JSONArray entryArray = feedObject.getJSONArray("entry");
for(int i = 0; i < entryArray.length(); i++){
JSONObject entryObjects = entryArray.getJSONObject(i);
JSONObject nameObject = entryObjects.getJSONObject("im:name");
String name = nameObject.getString("label");
cv.put(DB.COL_NAME, name);
mDB.insert(cv);
Log.d(LOG, "" + name);
}
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}