Enviando e analisando objetos JSON no Android [fechado]


137

Gostaria de enviar mensagens no formato de objetos JSON para um servidor e analisar a resposta JSON do servidor.

Exemplo de objeto JSON

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

Eu estou tentando analisar o JSON manualmente, indo atributo por atributo. Existe alguma biblioteca / utilitário que eu possa usar para facilitar esse processo?


2
Esse URL não está mais disponível ... você pode atualizá-lo?
Cipi 5/10

1
Aqui está um exemplo detalhado: Android - Exemplo de análise JSON
Paresh Mayani

1
@ Paresh Mayani & @ primpap .. Eu sei que podemos preencher dados do servidor usando JSON recebido do servidor usando o método get, estou confortável com isso .... mas se usarmos o método post para enviar os dados para o servidor, faça nós enviamos os dados como JSON novamente, estou me referindo à pergunta Quotation of primpap "Gostaria de enviar mensagens no formato de objetos JSON para um servidor Django" ..... Estou usando o Mysql no servidor .... ou Eu envio objeto JSON? ... você pode esclarecer esta informação para mim .... ou quaisquer links que me ajudar a entender o conceito será útil, Graças
Devrath

Respostas:


118

Estou surpreso que isso não tenha sido mencionado: mas, em vez de usar um processo manual e simples com o pequeno pacote do json.org, GSon e Jackson são muito mais convenientes de usar. Assim:

Portanto, você pode vincular-se aos seus próprios POJOs, não a alguns nós de árvore de meia-boca ou Listas e Mapas. (e pelo menos Jackson também permite a vinculação a essas coisas (talvez GSON também, não tenho certeza), JsonNode, Map, List, se você realmente deseja esses objetos em vez de objetos 'reais')

EDIT 19-MAR-2014:

Outro novo candidato é a biblioteca Jackson jr : ela usa o mesmo analisador / gerador de Streaming rápido que Jackson ( jackson-core), mas a parte de ligação de dados é minúscula (50kB). A funcionalidade é mais limitada (sem anotações, apenas Java Beans regulares), mas em termos de desempenho deve ser rápida e a sobrecarga de inicialização (primeira chamada) também muito baixa. Portanto, pode ser uma boa escolha, especialmente para aplicativos menores.


10
+1 para o GSON. Usamos especialmente os sites de suporte a streaming da GSON.google.com/site/gson/streaming em nossos aplicativos Android.
Andre Steingress

FWIW, Jackson também tem API de streaming: wiki.fasterxml.com/JacksonStreamingApi
StaxMan

2
Também +1 para streaming GSON. Implementado o streaming de Jackson no início, mas apesar de funcional na versão de depuração, o ProGuard gerou muitos erros e a versão de lançamento causa falhas difíceis de rastrear. Estou certo de que este não é um problema relacionado a Jackson, mas isso me fez mudar para o GSON, que funcionou bem e exigiu apenas 14kB adicionais para apenas streaming.
sven

E para o estúpido e imprevisível json mixando strings e listas ex: ["toto", "tata", ["monty", ["tor", "python"]]]? (tipo de estrutura de dados requerendo funções recursivas para a consumir)
christophe31

85

Você pode usar org.json.JSONObject e org.json.JSONTokener . você não precisa de bibliotecas externas, pois essas classes vêm com o Android SDK


Opa! Eu senti falta disso. De fato, elas são as bibliotecas org.json no site.
Gaurav Vaish

É isso que eu uso, e funciona como um encanto.
Adam

Seria ótimo se um exemplo ou um link para o mesmo pudesse ser dado. É mais fácil aprender dessa maneira. :)
Primal Pappachan


1
Muito mais comodidade, menos código para escrever: uma ou duas linhas em vez de dezenas.
StaxMan 14/09/10

31

O GSON é mais fácil de usar e o caminho a percorrer se os dados tiverem uma estrutura definida.

Faça o download do gson .

Adicione-o às bibliotecas referenciadas.

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

Código da classe Post

package com.tut.JSON;

public class Post {

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

4
Pelo que vale a pena, o código pode ser simplificado: a conversão JSONObject é desnecessária. E setters e getters são opcionais para o GSon; pode ser adicionado se quiser, mas não estritamente necessário.
StaxMan

4
Apenas para esclarecer o comentário de StaxMan. Seu exemplo é pegar jString, convertê-lo em um JSONObject e depois convertê-lo novamente em uma String para o gson ler. Basta usar pst = gson.fromJson (jString, Post.class). Eu acredito que isso também irá eliminar a necessidade de try-catch. E como o StaxMan também aponta, os setters e getters na classe Post.class não agregam valor. Seria útil para outros corrigir seu exemplo.
27511 Matt

Eu removi a parte de dupla conversão da resposta
whlk

4

Esta é a classe 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;

    }

Nota: DefaultHttpClient não é mais suportado pelo sdk 23, portanto, é aconselhável usar o destino sdk 21 com esse código.


3

Não há realmente nada no JSON. Os colchetes são para "objetos" (matrizes associativas) e os colchetes são para matrizes sem chaves (indexados numericamente). Quanto a trabalhar com ele no Android, existem aulas prontas para as incluídas no sdk (não é necessário fazer o download).

Confira estas classes: http://developer.android.com/reference/org/json/package-summary.html


Suponho que você quis dizer braçadeiras e não braçadeiras angulares!
Gaurav Vaish

2

Outras respostas observaram Jackson e GSON - as populares bibliotecas JSON de expansão para Android e json.org, o pacote JSON básico incluído no Android.

Mas acho que também vale a pena notar que o Android agora tem sua própria API JSON com todos os recursos.

Isso foi adicionado ao Honeycomb: API level 11.

Isso inclui
- android.util.JsonReader: docs e source
- android.util.JsonWriter: docs e source

Também acrescentarei uma consideração adicional que me leva de volta a Jackson e GSON: achei útil usar bibliotecas de terceiros em vez de pacotes android. * Porque, então, o código que escrevo pode ser compartilhado entre cliente e servidor. Isso é particularmente relevante para algo como JSON, em que você pode querer serializar dados para JSON em uma extremidade para enviar para a outra extremidade. Para casos de uso como esse, se você usa Java nas duas extremidades, ajuda a evitar a introdução de dependências android. *.

Ou eu acho que alguém poderia pegar o código-fonte relevante do Android. * E adicioná-lo ao seu projeto de servidor, mas eu não tentei isso ...



1

você só precisa importar isso

   import org.json.JSONObject;


  constructing the String that you want to send

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

estou usando dois objetos porque você pode ter um jsonObject dentro de outra

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");

então eu coloquei o post json dentro de outro assim

  param.put("post",post);

este é o método que eu uso para fazer uma solicitação

 makeRequest(param.toString());

public JSONObject makeRequest(String param)
{
    try
    {

configurando a conexão

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

definindo o fluxo de saída

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

eu uso isso para ver no logcat o que estou enviando

        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;

aqui a corda é construída

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

eu uso esse log para ver o que está chegando na resposta

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

instanciando um json com a String que contém a resposta do servidor

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

agradeço seu tempo de antecedência. Eu uso seu código para enviar string codificada em base64 para o servidor django, mas quando clico no botão para enviar para o servidor, o APP falha. Você poderia me ajudar a resolver isso?
Noman marwat 21/07/19

0

Se você está procurando uma análise rápida do json no android, sugiro uma ferramenta disponível gratuitamente.

Ferramenta JSON Class Creator

É de uso gratuito e cria sua classe all json parsing dentro de um a dois segundos ..: D


0

Embora já existam respostas excelentes para os usuários, como incentivar o uso do GSON, etc. Gostaria de sugerir o uso do org.json . Inclui a maioria das funcionalidades do GSON. Ele também permite que você passe a string json como argumento para o JSONObject e cuidará do resto, por exemplo:

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

Essa funcionalidade o torna meu favorito pessoal.


0

Existem diferentes bibliotecas de código aberto, que você pode usar para analisar o json.

org.json: - Se você quiser ler ou escrever json, poderá usar esta biblioteca. Primeiro crie o JsonObject: -

JSONObject jsonObj = new JSONObject(<jsonStr>);

Agora, use este objeto para obter seus valores: -

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

Você pode ver um exemplo completo aqui

Jackson databind: - Se você deseja vincular e analisar seu json a uma determinada classe POJO, pode usar a biblioteca jackson-databind, isso vinculará seu json à classe POJO: -

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

Você pode ver um exemplo completo aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.