Я хотел бы отправлять сообщения в виде объектов JSON на сервер и анализировать ответ JSON с сервера.
Пример объекта JSON
{
"post": {
"username": "John Doe",
"message": "test message",
"image": "image url",
"time": "current time"
}
}
Я пытаюсь разобрать JSON вручную, перейдя атрибут по атрибуту. Можно ли использовать какую-нибудь библиотеку / утилиту, чтобы упростить этот процесс?
Ответы:
Я удивлен, что они не были упомянуты: но вместо использования простого, а не ручного процесса с небольшим пакетом json.org, GSon и Jackson намного удобнее использовать. Так:
Таким образом, вы можете выполнять привязку к своим собственным POJO, а не к каким-то недоделанным узлам дерева или спискам и картам. (и, по крайней мере, Джексон допускает привязку к таким вещам (возможно, GSON тоже, не уверен), JsonNode, Map, List, если вы действительно хотите их вместо `` реальных '' объектов)
РЕДАКТИРОВАТЬ 19-МАР-2014:
Еще один новый претендент - библиотека Jackson jr : она использует тот же быстрый парсер / генератор Streaming, что и Jackson (
jackson-core
), но часть привязки данных крошечная (50 КБ). Функциональность более ограничена (без аннотаций, только обычные Java Beans), но производительность должна быть быстрой, а накладные расходы на инициализацию (первый вызов) также очень низкими. Так что это может быть хорошим выбором, особенно для небольших приложений.источник
Вы можете использовать org.json.JSONObject и org.json.JSONTokener . вам не нужны внешние библиотеки, поскольку эти классы поставляются с 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(); } } }
Код для почтового класса
package com.tut.JSON; public class Post { String message; String time; String username; Bitmap icon; }
источник
Это класс 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, для них есть готовые классы, включенные в sdk (загрузка не требуется).
Ознакомьтесь с этими классами: http://developer.android.com/reference/org/json/package-summary.html
источник
В других ответах были отмечены 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. * И добавить его в свой серверный проект, но я этого не пробовал ...
источник
Вы можете загрузить библиотеку с http://json.org (Json-lib или org.json) и использовать ее для синтаксического анализа / генерации JSON.
источник
вам просто нужно импортировать это
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; }
источник
Если вы ищете быстрый парсинг json в android, чем я предлагаю вам инструмент, который находится в свободном доступе.
Инструмент создания классов JSON
Его можно использовать бесплатно, и он создает весь ваш класс синтаксического анализа json за одну-две секунды ..: D
источник
Хотя пользователи уже дают отличные ответы, например, поощряют использование GSON и т. Д., Я хотел бы предложить использовать org.json . Он включает в себя большинство функций GSON. Он также позволяет вам передавать строку json в качестве аргумента JSONObject, и он позаботится об остальном, например:
JSONObject json = new JSONObject("some random json string");
Эта функция делает его моим личным фаворитом.
источник
Существуют различные библиотеки с открытым исходным кодом, которые вы можете использовать для анализа 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);
Вы можете увидеть полный пример здесь
источник