Проблема разобрать JSON

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Проблема разобрать JSON

Сообщение DevSergio » 28 апр 2013, 19:53

В общем пишу сейчас диплом и возникла такая трабла . Написал мини API на PHP для клиента которое отдает данные в JSON.
Вот часть кода на PHP которая отвечает за преобразование в JSON

Код: Выделить всё

<?php 
	include "connect_db.php";

	if(isset($_GET['format']) && intval($_GET['num'])) {
 
	$format = strtolower($_GET['format']);
	$num = intval($_GET['num']);
 
	mysql_query('SET NAMES \'UTF8\'');
	$result = mysql_query('SELECT * FROM categories ORDER BY `category_id` DESC LIMIT ' . $num, $con) or die('MySQL Error.');
 
	if($format == 'json') {
 
	$сategories = array();
        while($category = mysql_fetch_array($result, MYSQL_ASSOC)) {
               $categories[] = array('category'=>$category);
	}
 
	$output = json_encode($categories);
Здесь можно посмотреть результат : http://superquiz.zz.mu/api.php?format=json&num=5

Код: Выделить всё

[{"category":{"category_id":"37","category_name":"\u0441\u043f\u043e\u0440\u0442"}},{"category":{"category_id":"36","category_name":"fix"}},{"category":{"category_id":"35","category_name":"\u041f\u0441\u0438\u0445\u043e\u043b\u043e\u0433\u0438\u044f"}},{"category":{"category_id":"34","category_name":"\u041e\u041f Unix"}},{"category":{"category_id":"33","category_name":"\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437"}}]
А теперь сама реализация проекта под Android (парсинг JSON)

Код: Выделить всё

public class API {
	private HttpClient client;
	private HttpGet httpGet;
	private BufferedReader in;
	private JSONObject jObject;
	private ArrayList<Categories> categoriesArr = new ArrayList<Categories>();

	public API() {
		client = new DefaultHttpClient();
	}

	public ArrayList<Categories> getCategoryQuiz() {
		Log.d("1", "1");
		httpGet = new HttpGet(
				"http://superquiz.zz.mu/api.php?format=json&num=1");
		try {
			HttpResponse response = client.execute(httpGet);
			Log.d("status code", response.getStatusLine().getStatusCode() + "");
			in = new BufferedReader(new InputStreamReader(response.getEntity()
					.getContent()));
			StringBuffer sb = new StringBuffer("");
			String line = "";
			while ((line = in.readLine()) != null) {
				sb.append(line + "\n");
			}

			in.close();
			String result = sb.toString();
			/*
			 * jObject = new JSONObject(result.substring(result.indexOf("{"),
			 * result.lastIndexOf("}") + 1));
			 */
			Log.d("",result);
			
			jObject = new JSONObject(result);
			JSONArray arr = jObject.getJSONArray("category");
			for (int i = 0; i < arr.length(); i++) {
				JSONArray innerJsonArray = arr.getJSONArray(i);
		        JSONObject jsonObject = innerJsonArray.getJSONObject(0);
				String id = jsonObject.getString("category_id")
						.toString();
				String name = jsonObject.getString("category_name")
						.toString();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return categoriesArr;
	}
}
Выкидывает вот такой Exception -
org.json.JSONException: Value [{"category":{"category_name":"спорт","category_id":"37"}}] of type org.json.JSONArray cannot be converted to JSONObject
Кто знает как решить подскажите.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Проблема разобрать JSON

Сообщение neoksi » 28 апр 2013, 20:17

В Json:
{} - объект;
[] - массив.

Если коротко, вы пытаетесь объект открыть как массив, а парсер этого не допускает.

DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Re: Проблема разобрать JSON

Сообщение DevSergio » 28 апр 2013, 20:23

и как можно исправить?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Проблема разобрать JSON

Сообщение Mikhail_dev » 28 апр 2013, 21:04

Создавать new JSONArray, а не JSONObject, после чего уже работать с объектами. в полученном массиве.

DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Re: Проблема разобрать JSON

Сообщение DevSergio » 28 апр 2013, 21:30

Пример кода кто-то может привести , а то что-то у меня не получается . Вот так пробовал

Код: Выделить всё

			JSONArray jsonMainArr = new JSONArray(result);
			Log.d("mainArr", jsonMainArr + "");
Как достучаться теперь к главному объекту categories у которого поля category_id и category_name .

DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Re: Проблема разобрать JSON

Сообщение DevSergio » 28 апр 2013, 21:58

Все сам уже разобрался . Оказалось тупо невнимательность , наверно устал просто за сегодня .
Вот такой вот должен быть код если кому-то интересно.

Код: Выделить всё

JSONArray jsonMainArr = new JSONArray(result);
			for (int i = 0; i < jsonMainArr.length(); i++) {
				JSONObject mainJsonObject = jsonMainArr.getJSONObject(i);
				Log.d("mainArr", mainJsonObject + "");
				JSONObject innerJsonObject = mainJsonObject.getJSONObject("category");
				System.out.println(innerJsonObject.getString("category_id"));
				System.out.println(innerJsonObject.getString("category_name"));
				
			}

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Проблема разобрать JSON

Сообщение Mikhail_dev » 28 апр 2013, 22:33

Написал же, в полученном массиве. =) Да, во время усталости слона перед собой не увидишь. Это факт.

Ответить