Отправка и анализ объектов JSON
Я хотел бы отправить сообщения в виде объектов JSON на сервер и проанализировать ответ JSON с сервера.
Я думал об этом формате для ответа с сервера:
{
"post": {
"username": "someusername",
"message": "this is a sweet message",
"image": "http://localhost/someimage.jpg",
"time": "present time"
}
}
Сколько знаний JSON я должен выполнить для этой цели? Также было бы здорово, если бы кто-то мог предоставить мне ссылки на некоторые учебные пособия для отправки и разбора объектов JSON.
Ответы
Ответ 1
Я удивлен, что они не были упомянуты: вместо того, чтобы использовать голые кости, а не ручной процесс с небольшим пакетом json.org, GSon и Jackson гораздо удобнее использовать. Итак:
Таким образом, вы можете фактически привязываться к своим собственным POJO, а не к некоторым полузасужденным узлам дерева или спискам и картам.
(и, по крайней мере, Джексон допускает привязку к таким вещам (возможно, GSON также, не уверен), JsonNode, Map, List, если вы действительно хотите их вместо "реальных" объектов)
EDIT 19-MAR-2014:
Еще один новый соперник: библиотека Jackson jr: он использует тот же самый быстрый потоковый парсер/генератор, что и Джексон (jackson-core
), но привязывает данные часть крошечная (50kB). Функциональность более ограничена (без аннотаций, просто регулярная Java Beans), но производительность должна быть быстрой, а также слишком низкая инициализация (первый вызов).
Так что это может быть хорошим выбором, особенно для небольших приложений.
Ответ 2
Вы можете использовать org.json.JSONObject и org.json. JSONTokener. вам не нужны внешние библиотеки, поскольку эти классы поставляются с Android SDK
Ответ 3
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();
}
}
}
Код для класса Post
package com.tut.JSON;
public class Post {
String message;
String time;
String username;
Bitmap icon;
}
Надеюсь, что это поможет.
Ответ 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 с этим кодом.
Ответ 5
В JSON нет ничего особенного. Кудрявые скобки для "объектов" (ассоциативные массивы) и квадратные скобки для массивов без ключей (с цифровой индексацией). Что касается работы с ним в Android, для готовых классов, включенных в sdk, нет готовых классов (загрузка не требуется).
Проверьте эти классы:
http://developer.android.com/reference/org/json/package-summary.html
Ответ 6
Другие ответы отметили, что Jackson и GSON - популярные дополнительные JSON-библиотеки для Android и json.org - пакет JSON с голубыми костями, который включен в Android.
Но я думаю, что стоит также отметить, что Android теперь имеет свой собственный полнофункциональный JSON API.
Это было добавлено в Honeycomb: уровень API 11.
Это включает
- android.util.JsonReader: docs и source
- android.util.JsonWriter: docs и source
Я также добавлю еще одно соображение, которое подталкивает меня к Джексону и GSON: я счел полезным использовать сторонние библиотеки, а не пакеты android. *, потому что тогда код, который я пишу, можно разделить между клиентом и сервером. Это особенно важно для JSON, где вы можете сериализовать данные в JSON на одном конце для отправки на другой конец. Для использования подобных случаев, если вы используете Java на обоих концах, это помогает избежать введения андроидов. * Зависимости.
Или я предполагаю, что можно взять соответствующий исходный код android. * и добавить его в проект сервера, но я не пробовал...
Ответ 7
Вы можете загрузить библиотеку из http://json.org (Json-lib или org.json) и использовать ее для разбора/создания JSON
Ответ 8
если вы ищете быстрый json-анализ в android, чем я предлагаю вам инструмент, который свободно доступен.
Инструмент JSON Class Creator
Он бесплатный для использования, и он создает весь класс разбора json за одну-две секунды..: D
Ответ 9
Хотя уже есть отличные ответы, такие как поощрение использования GSON и т.д. Я бы хотел предложить использовать org.json, Он включает в себя большинство функций GSON. Он также позволяет передавать json string в качестве аргумента в JSONObject, и он позаботится об отдыхе, например:
JSONObject json = new JSONObject("some random json string");
Эта функция делает ее моей любимой.
Ответ 10
вам просто нужно импортировать этот
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();
установка выходного потока
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;
}
Ответ 11
Существуют различные библиотеки с открытым исходным кодом, которые можно использовать для разбора json.
org.json: - Если вы хотите читать или писать json, вы можете использовать эту библиотеку.
Сначала создайте JsonObject: -
JSONObject jsonObj = new JSONObject(<jsonStr>);
Теперь, используйте этот объект, чтобы получить свои значения: -
String id = jsonObj.getString("id");
Вы можете увидеть полный пример здесь
Jackson databind: -. Если вы хотите связать и разобрать ваш json в конкретный класс POJO, то вы можете использовать библиотеку jackson-databind, это свяжет ваш json с классом POJO: -
ObjectMapper mapper = new ObjectMapper();
post= mapper.readValue(json, Post.class);
Вы можете увидеть полный пример здесь