Exemplos práticos (Consumo/envio JSON com biblioteca remotamente)
Inicialmente cria-se um novo projeto no Android Studio. No arquivo build.gradle (Module:app) deve ser adicionado a linha implementation ‘com.google.code.gson:gson:2.11.0'. No arquivo AndroidManifest.xml deve ser adicionado a linha <uses-permission android:name="android.permission.INTERNET"/>.
Neste exemplo, será consumido o JSON retornado da seguinte URL: https://jsonplaceholder.typicode.com/posts/. Antes de implementar a classe MainActivity, primeiro será criado a classe POJO derivada do arquivo JSON. Neste material será usado a biblioteca criada por joelittlejohn, disponível em: http://www.jsonschema2pojo.org/. Esse site permite fazer a conversão de JSON para classe POJO para ser usada com a biblioteca GSON. A figura 1 mostra o site.

-
Para saber mais detalhes sobre as anotações @Expose e @SerializedName, acesse o link do site Stack Overflow: https://stackoverflow.com/questions/34752200/gson-expose-vs-serializedname. Pergunta realizada pelo usuário https://stackoverflow.com/users/867591/ahmed-faisal em 12 de jan. 2016 e respondida pelo usuário https://stackoverflow.com/users/8942811/bek em 7 de set. 2018. Acesso em: 21 de ago. 2025.
Após a criação da class POJO, pode-se dar continuidade no projeto. Os códigos estão disponibilizados a seguir:
No arquivo AndroidManifest.xml adicione <uses-permission android:name="android.permission.INTERNET" />
-
Conversao.java
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class Conversao { public String converter(InputStream inputStream) { if (inputStream == null) return null; InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder stringBuilder = new StringBuilder(); String conteudo; try { while ((conteudo = bufferedReader.readLine()) != null) { stringBuilder.append(conteudo).append("\n"); } } catch (IOException e) { e.printStackTrace(); } return stringBuilder.toString(); } }
-
Conexao.java
import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class Conexao { public InputStream obterRespostaHTTP(String end) { try { URL url = new URL(end); HttpURLConnection conexao = (HttpURLConnection) url.openConnection(); conexao.setRequestMethod("GET"); conexao.connect(); return new BufferedInputStream(conexao.getInputStream()); } catch (IOException e) { e.printStackTrace(); } return null; } }
-
Item.java
import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Item { @SerializedName("userId") @Expose private Integer userId; @SerializedName("id") @Expose private Integer id; @SerializedName("title") @Expose private String title; @SerializedName("body") @Expose private String body; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } @Override public String toString() { return "Item{" + "userId=" + userId + ", id=" + id + ", title='" + title + '\'' + ", body='" + body + '\'' + '}'; } }
-
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp" tools:context=".MainActivity"> <ListView android:id="@+id/listViewDados" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@android:color/darker_gray" android:dividerHeight="1dp" /> </LinearLayout>
-
MainActivity.java
import android.os.Bundle; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import androidx.appcompat.app.AppCompatActivity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.InputStream; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private ListView listView; private ArrayAdapter<String> adapter; private List<String> listaStrings; private final String URL = "https://jsonplaceholder.typicode.com/posts"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.listViewDados); listaStrings = new ArrayList<>(); adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listaStrings); listView.setAdapter(adapter); new obterDados().execute(); } private class obterDados extends AsyncTask<Void, Void, List<Item>> { @Override protected void onPreExecute() { super.onPreExecute(); Toast.makeText(getApplicationContext(), "Download começando...", Toast.LENGTH_SHORT).show(); } @Override protected List<Item> doInBackground(Void... voids) { Conexao conexao = new Conexao(); InputStream inputStream = conexao.obterRespostaHTTP(URL); Conversao Conversao = new Conversao(); String textoJSON = Conversao.converter(inputStream); Log.i("JSON", "doInBackground: " + textoJSON); if (textoJSON != null) { Gson gson = new Gson(); Type type = new TypeToken<List<Item>>() {}.getType(); return gson.fromJson(textoJSON, type); } return null; } @Override protected void onPostExecute(List<Item> dadosBaixados) { super.onPostExecute(dadosBaixados); if (dadosBaixados != null) { listaStrings.clear(); for (Item item : dadosBaixados) { listaStrings.add("UserID: " + item.getUserId() + "\nID: " + item.getId() + "\nTítulo: " + item.getTitle() + "\nBody: " + item.getBody()); } adapter.notifyDataSetChanged(); } else { Toast.makeText(getApplicationContext(), "Não foi possível obter JSON", Toast.LENGTH_SHORT).show(); } } } }
A classe AsyncTask foi descontinuada, segue a versão abaixo usando a classe Executor:
-
AndroidManisfest.xml: <uses-permission android:name="android.permission.INTERNET"/>
-
Arquivo Gradle: implementation("com.google.code.gson:gson:2.11.0")
-
Item.java
import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Item { @SerializedName("userId") @Expose private Integer userId; @SerializedName("id") @Expose private Integer id; @SerializedName("title") @Expose private String title; @SerializedName("body") @Expose private String body; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } @Override public String toString() { return "Item{" + "userId=" + userId + ", id=" + id + ", title='" + title + '\'' + ", body='" + body + '\'' + '}'; } }
-
Conexao.java
import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class Conexao { public InputStream obterRespostaHTTP(String end) { try { URL url = new URL(end); HttpURLConnection conexao = (HttpURLConnection) url.openConnection(); conexao.setRequestMethod("GET"); conexao.connect(); return new BufferedInputStream(conexao.getInputStream()); } catch (IOException e) { e.printStackTrace(); } return null; } }
-
Conversao.java
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class Conversao { public String converter(InputStream inputStream) { if (inputStream == null) return null;
InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder stringBuilder = new StringBuilder(); String conteudo; try { while ((conteudo = bufferedReader.readLine()) != null) { stringBuilder.append(conteudo).append("\n"); } } catch (IOException e) { e.printStackTrace(); } return stringBuilder.toString(); } }
-
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp" tools:context=".MainActivity"> <ListView android:id="@+id/listViewDados" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@android:color/darker_gray" android:dividerHeight="1dp" /> </LinearLayout>
-
MainActivity.java
import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.InputStream; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MainActivity extends AppCompatActivity { private ListView listView; private ArrayAdapter<String> adapter; private List<String> listaStrings; private final String URL = "https://jsonplaceholder.typicode.com/posts"; private List<Item> dadosBaixados; private ExecutorService executorService; private Handler mainHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.listViewDados); listaStrings = new ArrayList<>(); adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listaStrings); listView.setAdapter(adapter); executorService = Executors.newSingleThreadExecutor(); mainHandler = new Handler(Looper.getMainLooper()); obterDados(); }
private void obterDados() { Toast.makeText(getApplicationContext(), "Download começando...", Toast.LENGTH_SHORT).show(); executorService.execute(() -> { try { Conexao conexao = new Conexao(); InputStream inputStream = conexao.obterRespostaHTTP(URL); Conversao conversao = new Conversao(); String textoJSON = conversao.converter(inputStream); Log.i("JSON", "doInBackground: " + textoJSON); if (textoJSON != null) { Gson gson = new Gson(); Type type = new TypeToken<List<Item>>() {}.getType(); dadosBaixados = gson.fromJson(textoJSON, type); } List<String> finalLista = new ArrayList<>(); if (dadosBaixados != null) { for (Item item : dadosBaixados) { finalLista.add("UserID: " + item.getUserId() + "\nID: " + item.getId() + "\nTítulo: " + item.getTitle() + "\nBody: " + item.getBody()); } } mainHandler.post(() -> { if (dadosBaixados != null) { listaStrings.clear(); listaStrings.addAll(finalLista); adapter.notifyDataSetChanged(); } else { Toast.makeText(getApplicationContext(), "Não foi possível obter JSON", Toast.LENGTH_SHORT).show(); } }); } catch (Exception e) { e.printStackTrace(); mainHandler.post(() -> Toast.makeText(getApplicationContext(), "Erro ao baixar dados", Toast.LENGTH_SHORT).show() ); } }); } }
-
Referências: As classes Conexao e Conversao foram adaptadas do site Stack Overflow (https://stackoverflow.com/questions/58889465/json-parsing-error-value-jsonstr-of-type-java-lang-string-cannot-be-converted-t) realizada pelo usuário Saad ( https://stackoverflow.com/users/7741722/saad) e respondida por Mike M. (https://stackoverflow.com/users/2850651/mike-m). Acesso em: 21 de ago. 2025.
-
Exemplos práticos (API JSON SERVER)
Neste exemplo, será usado uma biblioteca que permite criar uma API REST falsa destinada à testes. Para maiores detalhes sobre o biblioteca, acesse o endereço: https://github.com/typicode/json-server. Acesso em: 30 de jan. 2023.
Conforme mostra no endereço supracitado para instalar o json-server, basta abrir o terminal e digitar o comando: npm install -g json-server
Atenção: É necessário ter o node.js instalado no computador para biblitoca funcionar. Em seguida, crie um arquivo com extensão.json, por exemplo db.json, banco.json, dados.json, etc.
db.json
{
"agenda" : [
{ "id" : 1 , "nome" : "Ana" , "telefone" : "1111-1111" },
{ "id" : 2 , "nome" : "Helder" , "telefone" : "2222-2222" },
{ "id" : 3 , "nome" : "Fagno" , "telefone" : "3333-3333" }
],
"adicionais" : [
{ "id" : 1 , "email" : "ana@ifto.edu.br"},
{ "id" : 2 , "email" : "helder@ifto.edu.br"},
{ "id" : 3 , "email" : "fagno@ifto.edu.br"}
]
}
Após salvar o arquivo abre o terminal e vamos ligar o servidor usando o comando: json-server db.json
Se tudo deu certo, a seguinte mensagem será impressa no terminal:
\{^_^}/ hi! Loading db.json Done
Resources http://localhost:3000/agenda //o conteúdo do arquivo db.json, porém mostrando o conteúdo do array agenda http://localhost:3000/adicionais //o conteúdo do arquivo db.json, porém mostrando o conteúdo do array adicionais
Infelizmente, não é possível consumir o arquivo disponibilizado pelo endereço: http://localhost:3000, pois o Android, por questões de segurança, atualmente aceita apenas comunicação via HTTPS. Mas a equipe que desenvolveu a biblioteca também disponibiliza um servidor com HTTPS chamado My JSON Server cujo o endereço para acesso é: https://my-json-server.typicode.com/. Na página Web supracitada tem-se os passos necessários para usar o servidor. São etapas simples, como pode ser vista a seguir:
-
Crie uma conta no GitHub;
-
Crie um repositório;
-
Crie um arquivo chamado db.json (coloque o conteúdo já disponibilizado neste exemplo).
-
Acesse o endereço https://my-json-server.typicode.com/<coloque seu nome de usuário><coloque o nome do repositório criado>
E pronto, o seu arquivo json já estará disponível no servidor on-line. A figura 3 mostra o resultado.
Figura 3

Observe na figura 3 que há 3 links clicáveis:
-
na opção agenda, serão mostrados os dados contidos dentro do array agenda;
-
na opção adicionais, serão mostrados os dados contidos dentro do array adicionais;
-
e na opção db, serão mostrados tanto o array agenda e o adicionais com os conteúdos.
Agora, basta criar um app cliente no Android para consumir os dados disponíveis em: https://my-json-server.typicode.com/<seu nome de usuário no GitHub><seu repositório>/db.