Парсинг JSON, возвращаемый php в java android

341
10 декабря 2016, 10:11

Привет, у меня есть php, который мне json'ом возвращает несколько значений:

  • day
  • class
  • letter
  • lesson
  • task

Он их берёт из таблицы SQL и возвращает вроде как массивом.

Вот код php:

$sql = "SELECT * FROM `table_name`";
   $result = $conn->query($sql); 
   while ($row = $result->fetch_assoc())
   { 
       $day["day:"] = ($row['day']);
       $class["class:"] = ($row['class']);
       $letter["letter:"] = ($row['letter']);
       $lesson["lesson:"] = ($row['lesson']);
       $task["task:"] = ($row['task']);
       echo json_encode($day);
       echo json_encode($class);
       echo json_encode($letter);
       echo json_encode($lesson);
       echo json_encode($task);
   }

Так вот пытаюсь я это в java коде принять, и вроде как принимаю, и всё бы было ничего, но тут сталкиваюсь с проблемой..

Мне необходимо запихнуть данные в ListView..

Вот такую штуку скрипт мне даёт:

{"day:":"Четверг"}{"class:":"3 класс"}{"letter:":"А"}{"lesson:":"География"}{"task:":"Задание 1"}

Я ее в приложении принял в строку и передал в JSONObject и пытаюсь передать в ListView следующим кодом:

public void JSONURL(String result) {
        try {
            JSONObject json = new JSONObject(result);
            System.out.println(json);
            JSONObject uDay = json.getJSONObject("day");
            JSONObject uClass = json.getJSONObject("class");
            JSONObject uLetter = json.getJSONObject("letter");
            JSONObject uLesson = json.getJSONObject("lesson");
            JSONObject uTask = json.getJSONObject("task");
            for (int i = 0; i < uLesson.length(); i++) {
                HashMap<String, Object> hm;
                hm = new HashMap<String, Object>();
                hm.put(DAY, uDay.getString("day").toString());
                hm.put(CLASS, uClass.getString("class").toString());
                hm.put(LETTER, uLetter.getString("letter").toString());
                hm.put(LESSON, uLesson.getString("lesson").toString());
                hm.put(TASK, uTask.getString("task").toString());
                myBooks.add(hm);
                SimpleAdapter adapter = new SimpleAdapter(showHomework.this, myBooks, R.layout.list,
                        new String[] { TASK, CLASS, LETTER, LESSON, DAY}, new int[] { R.id.text1, R.id.text2, R.id.text3, R.id.text4, R.id.text5  });
                //выводим в листвью
                listView.setAdapter(adapter);
                listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            }
        } catch (JSONException e) {
            Log.e("log_tag", "Error parsing data " + e.toString());
        }
    }

Вооот... А терминал Android Studio выдаёт ошибку:

Error parsing data org.json.JSONException: No value for day.

Как я понял моё код не может найти соответственное значение day в json'е..

Ребят, прошу не ругаться, я в этой теме новичок.. Помогите чем можете..

Answer 1

Формируем массив, в php, и конвертируем в json строку

$data=[
    'day'=>$row['day'],
    'class'=>$row['class'],
    'letter'=>$row['letter'],
    'lesson'=>$row['lesson'],
    'task'=>$row['task']
];
echo json_decode($data);

Пример Java:

JSONParser parser = new JSONParser();
Object obj = parser.parse(response);
JSONObject jsonObj = (JSONObject) obj;
System.out.println(jsonObj.get("day"));

С java не знаком, по этому - Источник

Answer 2

Эксепшен вы получаете потому что вы пытаетесь взять значение по неправильному ключу. Сервер вам возвращает значение дня по ключу "day:", а вы парсите по ключу "day". Просто добавьте двоеточие, и все заработает.(то же самое в остальных полях)

READ ALSO
Action для form на PHP

Action для form на PHP

Есть форма отзыва с простой каптчей

249
PostgreSQL + XAMPP + yii2, Database Exception

PostgreSQL + XAMPP + yii2, Database Exception

Соединил XAMPP, yii и postgreSQLСоздал элементарную бд, схему, 1 таблицу, в таблице 3 столбца: id_point (key,integer, это наш айдишник), title(text), point_xy(point)

241
Проблема с кодировкой php

Проблема с кодировкой php

Есть строка русская, пытаюсь вывести, выводит: ааыв

159
XPath разделить элементы

XPath разделить элементы

Подскажите пожалуйста, как можно составить правильный XPath, чтобы получить только сам текст этого отзыва, без заголовка и датыЕсть вот такой...

246