Отправка и анализ объектов 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);

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