PHP / Android и JSONObject; Кажется, я могу получить доступ только к последнему элементу - PullRequest
1 голос
/ 18 апреля 2011

У меня есть установка, где он возвращает, возможно, приличное количество информации.Вот logcat:

04-17 22:38:21.886: DEBUG/TestMYSQL(12603): Result of sql: 
[{"id":"1","front_text":"the dog was so cute","back_text":"its name was dolly"},
{"id":"2","front_text":"plants use the sun","back_text":"isn't that interesting"},
{"id":"3","front_text":"plants can use the sun to create","back_text":"energy"},
{"id":"4","front_text":"a plant also needs minerals","back_text":"from the soil"},
{"id":"5","front_text":"without water the plant would","back_text":"probably die"},
{"id":"6","front_text":"plants are little machines","back_text":"who love to eat"}]

Чтобы получить эту информацию, я должен выполнить файл php.Вот некоторый соответствующий код Java и Android:

    .....
    result = sb.toString();
        Log.d(TAG, "Result of sql: " + result);
    } catch (Exception e) {
        Log.e("log_tag", "Error converting result " + e.toString());
    }

    // parse json data
    JSONObject json_data = null;
    try {
        JSONArray jArray = new JSONArray(result);
        for (int i = 0; i < jArray.length(); i++) {

            json_data = jArray.getJSONObject(i);
        }
        return json_data;

Превращает результаты в jsonObject, с которым я могу поиграть.

Итак, здесь есть шаг до, часть запроса в php:

    include 'connectMySQL.php';

    mysql_select_db("card_db");
    $q=mysql_query("SELECT * FROM ".$packname);

    while($e=mysql_fetch_assoc($q)){
        $output[]=$e;
    }
    print(json_encode($output));
    mysql_close();

Проблема в том, что у меня только кажется, что у меня есть доступ только к ЗАКЛЮЧИТЕЛЬНОЙ строке.То есть, в приведенных выше данных я могу только получить доступ к строке id: 6.

Я смотрю на auto_complete и JSONOBJECT, но у меня нет достаточного опыта, чтобы понять это в данный момент,и уже поздно.

Есть какие-нибудь идеи о том, как перебрать jsonObject в java?

Позвольте мне уделить минуту и ​​проанализировать структуру на секунду, прежде чем включить. Я не знаюмногое о JSON, но вот как это выглядит:

Я запрашиваю базу данных с таблицами, которые я настроил, бла-бла.Возвращает строки данных.Я предполагаю, что мой вопрос заключается в том, как строка пар ключ-значение кодируется в объект JSON и как я могу получить доступ к различным «строкам»?

1 Ответ

1 голос
/ 18 апреля 2011

Вы перезаписываете JSONObject, на который ссылается json_data в каждой итерации цикла. Таким образом, в конце он всегда возвращает последний элемент в jArray.

Поскольку вам нужно вернуть несколько объектов, вы можете:

  • просто возвращает jArray вызывающей функции. Однако это означает, что вызывающей стороне придется иметь дело с деталями реализации передачи данных, и если вы решили изменить библиотеки или перейти на XML, это сломает много кода и сделает его намного сложнее.

  • возвращает массив или список реальных объектов, о которых знает вызывающий код и с которыми он должен иметь дело. Например, вы можете объявить объект-значение (VO) с id, front_text, back_text, и для каждого JSONObject в jArray вы создадите новый VO, поместите его в массив и вернете его.

    public class MyVO
    {
        final public String id;
        final public String frontText;
        final public String backText;
    
        public MyVO(String id, String ft, String bt)
        {
            this.id = id;
            this.frontText = ft;
            this.backText = bt;
        }
    }
    
    List<MyVo> vos = new ArrayList<MyVO>();
    JSONArray jArray = new JSONArray(result);
    for (int i = 0; i < jArray.length(); i++) {
       json_data = jArray.getJSONObject(i);
       vos.add(new MyVO(json_data.getString("id"), json_data.getString("front_text"), json_data.getString("back_text"));
    }
    

    В коде вызова вы можете перейти через VO:

    for(MyVO vo : vos)
    {
        //vo.id or vo.frontText or vo.backText
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...