Отправка и анализ объектов JSON в Android [закрыто]


138

Я хотел бы отправлять сообщения в виде объектов JSON на сервер и анализировать ответ JSON с сервера.

Пример объекта JSON

{
  "post": {
    "username": "John Doe",
    "message": "test message",
    "image": "image url",
    "time":  "current time"
  }
}

Я пытаюсь разобрать JSON вручную, перейдя атрибут по атрибуту. Можно ли использовать какую-нибудь библиотеку / утилиту, чтобы упростить этот процесс?


2
Этот URL больше не доступен ... не могли бы вы его обновить?
Cipi 05

1
Вот подробный пример: Android - пример анализа JSON
Пареш Майани

1
@ Paresh Mayani & @ primpap .. Я знаю, что мы можем заполнить данные с сервера, используя JSON, полученный с сервера с помощью метода get, мне это удобно .... но если мы используем метод post для отправки данных на сервер, сделайте мы снова отправляем данные как JSON, я имею в виду цитату из вопроса primpap «Я хотел бы отправлять сообщения в виде объектов JSON на сервер Django» ..... Я использую Mysql на сервере .... или Я отправляю объект JSON? ... не могли бы вы прояснить мне эту информацию .... или любые ссылки, которые помогут мне понять концепцию, будут полезны, спасибо
Devrath

Ответы:


118

Я удивлен, что они не были упомянуты: но вместо использования простого, а не ручного процесса с небольшим пакетом json.org, GSon и Jackson намного удобнее использовать. Так:

Таким образом, вы можете выполнять привязку к своим собственным POJO, а не к каким-то недоделанным узлам дерева или спискам и картам. (и, по крайней мере, Джексон допускает привязку к таким вещам (возможно, GSON тоже, не уверен), JsonNode, Map, List, если вы действительно хотите их вместо `` реальных '' объектов)

РЕДАКТИРОВАТЬ 19-МАР-2014:

Еще один новый претендент - библиотека Jackson jr : она использует тот же быстрый парсер / генератор Streaming, что и Jackson ( jackson-core), но часть привязки данных крошечная (50 КБ). Функциональность более ограничена (без аннотаций, только обычные Java Beans), но производительность должна быть быстрой, а накладные расходы на инициализацию (первый вызов) также очень низкими. Так что это может быть хорошим выбором, особенно для небольших приложений.


10
+1 для GSON. Мы особенно использовали сайты поддержки потоковой передачи GSON.google.com/site/gson/streaming в наших приложениях для Android.
Андре Штейнгресс

FWIW, у Джексона также есть потоковый API: wiki.fasterxml.com/JacksonStreamingApi
StaxMan

2
Также +1 для потоковой передачи GSON. Сначала была реализована потоковая передача Джексона, но, хотя она работала в отладочной версии, ProGuard генерировал множество ошибок, а версия выпуска вызывает сбои, которые трудно отследить. Я уверен, что это не проблема Джексона, но это заставило меня переключиться на GSON, который работал нормально и требовал дополнительных 14 КБ только для потоковой передачи.
sven

А для тупой непредсказуемой строки смешивания json и списков ex: ["toto", "tata", ["monty", ["tor", "python"]]]? (вид структуры данных, требующей рекурсивных функций для ее использования)
christophe31

85

Вы можете использовать org.json.JSONObject и org.json.JSONTokener . вам не нужны внешние библиотеки, поскольку эти классы поставляются с Android SDK


Ой! Я пропустил это. Фактически, это библиотеки org.json на веб-сайте.
Гаурав Вайш

Это то, что я использую, и это работает как шарм.
Адам

Было бы здорово, если бы можно было привести пример или ссылку на него. Так легче научиться. :)
Primal Pappachan


1
Гораздо больше удобства, меньше кода: одна-две строки вместо десятков.
StaxMan,

31

GSON - самый простой в использовании и подходящий вариант, если данные имеют определенную структуру.

Загрузите файл gson .

Добавьте его в указанные библиотеки.

package com.tut.JSON;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class SimpleJson extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String jString = "{\"username\": \"tom\", \"message\": \"roger that\"}  ";


        GsonBuilder gsonb = new GsonBuilder();
        Gson gson = gsonb.create();
        Post pst;

        try {
            pst = gson.fromJson(jString,  Post.class);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

Код для почтового класса

package com.tut.JSON;

public class Post {

    String message;
    String time;
    String username;
    Bitmap icon;
}

4
Как бы то ни было, код можно упростить: преобразование JSONObject не требуется. Сеттеры и геттеры для GSon не обязательны; могут быть добавлены при желании, но это не является строго необходимым.
StaxMan

4
Просто чтобы прояснить комментарий StaxMan. В вашем примере используется jString, который преобразуется в JSONObject, а затем преобразуется обратно в String для чтения gson. Просто используйте pst = gson.fromJson (jString, Post.class). Я считаю, что это также избавит от необходимости пробовать ловить рыбу. И, как также указывает StaxMan, сеттеры и геттеры в Post.class не добавляют значения. Другим было бы полезно поправить ваш пример.
Мэтт

Я удалил часть двойного преобразования из ответа
whlk

4

Это класс JsonParser

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }

Примечание. DefaultHttpClient больше не поддерживается sdk 23, поэтому рекомендуется использовать целевой sdk 21 с этим кодом.


3

В JSON нет ничего особенного. Фигурные скобки предназначены для «объектов» (ассоциативных массивов), а квадратные скобки - для массивов без ключей (с числовой индексацией). Что касается работы с ним в Android, для них есть готовые классы, включенные в sdk (загрузка не требуется).

Ознакомьтесь с этими классами: http://developer.android.com/reference/org/json/package-summary.html


Я полагаю, вы имели в виду фигурные скобки, а не угловые скобки!
Гаурав Вайш

2

В других ответах были отмечены Jackson и GSON - популярные дополнительные библиотеки JSON для Android и json.org, простой пакет JSON, включенный в Android.

Но я думаю, что также стоит отметить, что Android теперь имеет собственный полнофункциональный JSON API.

Это было добавлено в Honeycomb: API level 11.

Сюда входят
- android.util.JsonReader: docs и источник
- android.util.JsonWriter: docs и исходный код.

Я также добавлю одно дополнительное соображение, которое подталкивает меня к Джексону и GSON: я счел полезным использовать сторонние библиотеки, а не пакеты android. *, Потому что тогда код, который я пишу, может использоваться совместно клиентом и сервером. Это особенно актуально для чего-то вроде JSON, где вы можете захотеть сериализовать данные в JSON на одном конце для отправки на другой конец. Для подобных случаев использование Java на обоих концах помогает избежать появления зависимостей android. *.

Или, я думаю, можно было бы взять соответствующий исходный код android. * И добавить его в свой серверный проект, но я этого не пробовал ...



1

вам просто нужно импортировать это

   import org.json.JSONObject;


  constructing the String that you want to send

 JSONObject param=new JSONObject();
 JSONObject post=new JSONObject();

Я использую два объекта, потому что у вас может быть jsonObject внутри другого

post.put("username(here i write the key)","someusername"(here i put the value);
post.put("message","this is a sweet message");
post.put("image","http://localhost/someimage.jpg");
post.put("time":  "present time");

затем я помещаю сообщение json в другое, например

  param.put("post",post);

это метод, который я использую, чтобы сделать запрос

 makeRequest(param.toString());

public JSONObject makeRequest(String param)
{
    try
    {

установка соединения

        urlConnection = new URL("your url");
        connection = (HttpURLConnection) urlConnection.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-type", "application/json;charset=UTF-8");
        connection.setReadTimeout(60000);
        connection.setConnectTimeout(60000);
        connection.connect();

установка выходного потока

        dataOutputStream = new DataOutputStream(connection.getOutputStream());

Я использую это, чтобы увидеть в логарифме, что я отправляю

        Log.d("OUTPUT STREAM  " ,param);
        dataOutputStream.writeBytes(param);
        dataOutputStream.flush();
        dataOutputStream.close();

        InputStream in = new BufferedInputStream(connection.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        result = new StringBuilder();
        String line;

здесь строка построена

        while ((line = reader.readLine()) != null)
        {
            result.append(line);
        }

я использую этот журнал, чтобы увидеть, что он приходит в ответ

         Log.d("INPUTSTREAM: ",result.toString());

создание экземпляра json со строкой, содержащей ответ сервера

        jResponse=new JSONObject(result.toString());

    }
    catch (IOException e) {
        e.printStackTrace();
        return jResponse=null;
    } catch (JSONException e)
    {
        e.printStackTrace();
        return jResponse=null;
    }
    connection.disconnect();
    return jResponse;
}

заранее спасибо за ваше время. Я использую ваш код для отправки строки в кодировке base64 на сервер django, но когда я нажимаю кнопку для отправки на сервер, приложение выходит из строя. Не могли бы вы мне помочь, как с этим справиться?
Noman Marwat

0

Если вы ищете быстрый парсинг json в android, чем я предлагаю вам инструмент, который находится в свободном доступе.

Инструмент создания классов JSON

Его можно использовать бесплатно, и он создает весь ваш класс синтаксического анализа json за одну-две секунды ..: D


0

Хотя пользователи уже дают отличные ответы, например, поощряют использование GSON и т. Д., Я хотел бы предложить использовать org.json . Он включает в себя большинство функций GSON. Он также позволяет вам передавать строку json в качестве аргумента JSONObject, и он позаботится об остальном, например:

JSONObject json = new JSONObject("some random json string");

Эта функция делает его моим личным фаворитом.


0

Существуют различные библиотеки с открытым исходным кодом, которые вы можете использовать для анализа json.

org.json: - Если вы хотите читать или писать json, вы можете использовать эту библиотеку. Сначала создайте JsonObject: -

JSONObject jsonObj = new JSONObject(<jsonStr>);

Теперь используйте этот объект, чтобы получить свои значения: -

String id = jsonObj.getString("id");

Вы можете увидеть полный пример здесь

Привязка данных Джексона: - Если вы хотите привязать и проанализировать свой json к определенному классу POJO, вы можете использовать библиотеку привязки данных Джексона , это свяжет ваш json с классом POJO:

ObjectMapper mapper = new ObjectMapper();
post= mapper.readValue(json, Post.class);

Вы можете увидеть полный пример здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.