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

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

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

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

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

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

  • GSON
  • jackson

Таким образом, вы можете фактически привязываться к своим собственным POJO, а не к некоторым полузасужденным узлам дерева или спискам и картам. (и, по крайней мере, jackson допускает связывание с такими вещами (возможно, GSON, а не уверен), JsonNode, Map, List, если вы действительно хотите их вместо «реальных» объектов)

EDIT 19-MAR-2014:

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

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

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(); } } } 

Код для classа Post

 package com.tut.JSON; public class Post { String message; String time; String username; Bitmap icon; } 

Надеюсь, поможет.

Полное решение

Это class 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 с этим кодом.

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

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

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

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

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

Это включает
– android.util.JsonReader: документы и источник
– android.util.JsonWriter: документы и источник

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

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

Вы можете загрузить библиотеку из http://json.org (Json-lib или org.json) и использовать ее для parsingа / создания JSON

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

  import org.json.JSONObject; constructing the String that you want to send JSONObject param=new JSONObject(); JSONObject post=new JSONObject(); 

im, используя два объекта, потому что вы можете иметь 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(); 

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

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

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

  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 с помощью String, который содержит ответ сервера

  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; } 

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

Инструмент JSON Class Creator

Он можно использовать, и он создает весь class parsingа json в течение одной-двух секунд ..: D

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

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

Эта функция делает его моим любимым.

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

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

 JSONObject jsonObj = new JSONObject(); 

Теперь используйте этот объект для получения ваших значений: –

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

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

Jackson databind: – Если вы хотите связать и разобрать свой json в конкретный class POJO, то вы можете использовать библиотеку jackson-databind, это свяжет ваш json с classом POJO:

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

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

  • Как получить ответ как String с использованием модификации без использования GSON или любой другой библиотеки в android
  • Как разобрать JSON в Android?
  • Есть ли Java XML API, который может анализировать документ без разрешения объектов символов?
  • Логическое выражение (грамматика) в c ++
  • Используемый парсер Улица Адрес, Город, Штат, Почтовый индекс из строки
  • c # преобразовать строковое выражение в логическое выражение
  • Разбор JSON для Java - приложение для Android
  • чтение файла по строкам в go
  • Java: parse java исходный код, методы извлечения
  • Строка parse для DateTime в C #
  • Как сделать Integer.parseInt () для десятичного числа?
  • Interesting Posts

    Внедрение архитектуры плагинов / системы плагинов / сменных фреймов в Angular 2, 4, 5, 6

    Как читать двоичный файл в вектор беззнаковых символов

    Может ли столбцы столбцов индекса PostgreSQL?

    Как захватить событие «виртуальная клавиатура show / hide» в Android?

    Как создать случайный int в C?

    Как достичь «виртуальной функции шаблона» в C ++

    OkHttp Library – NetworkOnMainThreadException при простой записи

    существует ли стандартный способ определения источника данных JDBC для контейнеров Java EE?

    Должен ли я беспокоиться о выравнивании во время каста?

    В чем разница между компонентом и директивой?

    Swift: как использовать флаги PREPROCESSOR (например, `#if DEBUG`) для реализации ключей API?

    Как экспортировать таблицу Hive в файл CSV?

    Могу ли я установить Windows 10 с локальной учетной записью?

    Как преобразовать ленивую последовательность в неловянную в Clojure

    Как получить расширение файла файла на Java?

    Давайте будем гением компьютера.