Introdução ao JSON-Java (org.json)

Introdução ao JSON-Java (org.json)

1. Introdução ao JSON-Java

JSON (um acrônimo para JavaScript Object Notation) é um formato de intercâmbio de dados leve e émost commonly used for client-server communication. É fácil de ler / escrever e independente de linguagem. Um valor JSON pode ser outro JSONobject, array, number, string, boolean (verdadeiro / falso) ounull.

Neste tutorial, veremos como podemos criar, manipular e analisar JSON usando uma das bibliotecas de processamento JSON disponíveis, ou seja, a bibliotecaJSON-Java também é conhecida comoorg.json.

Leitura adicional:

Iterando sobre uma Instância de org.json.JSONObject

Aprenda a iterar e percorrer um JSONObject

Read more

Escapar JSON String em Java

Aprenda maneiras de escapar de uma biblioteca ou Java principal do JSON String

Read more

2. Pré-requisito

Antes de começarmos, precisaremos adicionar a seguinte dependência em nossopom.xml:


    org.json
    json
    20180130

A versão mais recente pode ser encontrada emMaven Central repository.

Observe que este pacote já foi incluído no Android SDK, portanto, não devemos incluí-lo ao usar o mesmo.

3. JSON em Java [package org.json]

A bibliotecaJSON-Java também é conhecida comoorg.json (não deve ser confundida comorg.json.simple do Google) nos fornece classes que são usadas para analisar e manipular JSON em Java.

Além disso, esta biblioteca também pode converter entre JSON, XML, cabeçalhos HTTP, cookies, texto ou lista delimitada por vírgulas, etc.

Neste tutorial, daremos uma olhada em:

  1. JSONObject - semelhante ao objeto nativoMap de Java que armazena pares de valor-chave não ordenados

  2. JSONArray - uma sequência ordenada de valores semelhante à implementação do vetor nativo de Java

  3. JSONTokener - uma ferramenta que divide um pedaço de texto em uma série detokens que pode ser usada porJSONObject ouJSONArray para analisar strings JSON

  4. CDL - uma ferramenta que fornece métodos para converter texto delimitado por vírgulas emJSONArray e vice-versa

  5. Cookie - converte de JSONString em cookies e vice-versa

  6. HTTP - usado para converter JSONString em cabeçalhos HTTP e vice-versa

  7. JSONException - esta é uma exceção padrão lançada por esta biblioteca

4. JSONObject

UmJSONObject é uma coleção não ordenada de pares de chave e valor, semelhante às implementaçõesMap nativas de Java.

  • As chaves sãoStrings exclusivas que não podem sernull

  • Os valores podem ser qualquer um deBoolean,Number,String,JSONArray ou mesmo um objetoJSONObject.NULL

  • UmJSONObject pode ser representado por umString entre chaves com chaves e valores separados por dois pontos e pares separados por uma vírgula

  • Tem vários construtores com os quais construir umJSONObject

Ele também suporta os seguintes métodos principais:

  1. get(String key) – gdefine o objeto associado à chave fornecida, lançaJSONException se a chave não for encontrada

  2. opt(String key)- gdefine o objeto associado à chave fornecida,null caso contrário

  3. put(String key, Object value) – insere ou substitui um par de valores-chave noJSONObject. atual

O métodoput() é um método sobrecarregado que aceita uma chave do tipoStringe vários tipos para o valor.

Para a lista completa de métodos suportados porJSONObject,visit the official documentation.

Vamos agora discutir algumas das principais operações suportadas por esta classe.

4.1. Criando JSON diretamente deJSONObject

JSONObject expõe uma API semelhante à interfaceMap de Java. Podemos usar o métodoput() e fornecer a chave e o valor como argumento:

JSONObject jo = new JSONObject();
jo.put("name", "jon doe");
jo.put("age", "22");
jo.put("city", "chicago");

Agora, nossoJSONObject ficaria assim:

{"city":"chicago","name":"jon doe","age":"22"}

Existem sete diferentes assinaturas sobrecarregadas do métodoJSONObject.put(). Embora a chave só possa ser exclusiva, o valor não nuloString, pode ser qualquer coisa.

4.2. Criação de JSON do mapa

Em vez de colocar diretamente a chave e os valores emJSONObject, podemos construir umMape personalizado e, em seguida, passá-lo como um argumento para o construtor deJSONObject.

Este exemplo produzirá os mesmos resultados acima:

Map map = new HashMap<>();
map.put("name", "jon doe");
map.put("age", "22");
map.put("city", "chicago");
JSONObject jo = new JSONObject(map);

4.3. CriandoJSONObject de JSONString

Para analisar um JSONString para umJSONObject, podemos simplesmente passarString para o construtor.

Este exemplo produzirá os mesmos resultados acima:

JSONObject jo = new JSONObject(
  "{\"city\":\"chicago\",\"name\":\"jon doe\",\"age\":\"22\"}"
);

O argumentoString passado deve ser um JSON válido, caso contrário, este construtor pode lançar umJSONException.

4.4. Serializar objeto Java para JSON

Um dos construtoresJSONObject's leva um POJO como argumento. No exemplo abaixo, o pacote usa os getters da classeDemoBeane cria umJSONObject apropriado para o mesmo.

Para obter umJSONObject de um objeto Java, teremos que usar uma classe que seja umJava Bean válido:

DemoBean demo = new DemoBean();
demo.setId(1);
demo.setName("lorem ipsum");
demo.setActive(true);

JSONObject jo = new JSONObject(demo);

OJSONObject jo para este exemplo vai ser:

{"name":"lorem ipsum","active":true,"id":1}

Embora tenhamos uma maneira de serializar um objeto Java para uma string JSON, não há como convertê-lo novamente usando esta biblioteca.

Se quisermos esse tipo de flexibilidade, podemos mudar para outras bibliotecas, comoJackson.

5. JSONArray

UmJSONArray é uma coleção ordenada de valores, semelhante à implementaçãoVector nativa de Java.

  • Os valores podem ser qualquer coisa deNumber,String,Boolean,JSONArray,JSONObject ou mesmo um objetoJSONObject.NULL

  • É representado por umString entre colchetes e consiste em uma coleção de valores separados por vírgulas

  • ComoJSONObject, ele tem um construtor que aceita uma fonteString e a analisa para construir umJSONArray

A seguir estão os métodos principais da classeJSONArray:

  1. get(int index) – rretorna o valor no índice especificado (entre 0 e comprimento total - 1), caso contrário, joga umJSONException

  2. opt(int index) - retorna o valor associado a um índice (entre 0 e comprimento total - 1). Se não houver valor nesse índice, umnull é retornado

  3. put(Object value) - acrescenta um valor de objeto a esteJSONArray. Este método está sobrecarregado e suporta uma ampla gama de tipos de dados

Para uma lista completa de métodos suportados por JSONArray,visit the official documentation.

5.1. CriandoJSONArray

Depois de inicializar um objeto JSONArray, podemos simplesmente adicionar e recuperar elementos usando os métodosput()eget():

JSONArray ja = new JSONArray();
ja.put(Boolean.TRUE);
ja.put("lorem ipsum");

JSONObject jo = new JSONObject();
jo.put("name", "jon doe");
jo.put("age", "22");
jo.put("city", "chicago");

ja.put(jo);

A seguir estaria o conteúdo de nossoJSONArray (o código é formatado para maior clareza):

[
    true,
    "lorem ipsum",
    {
        "city": "chicago",
        "name": "jon doe",
        "age": "22"
    }
]

5.2. CriandoJSONArray diretamente da string JSON

ComoJSONObject, oJSONArray também tem um construtor que cria um objeto Java diretamente de um JSONString:

JSONArray ja = new JSONArray("[true, \"lorem ipsum\", 215]");

Este construtor pode lançar umJSONException se a fonteString não for um JSONString válido.

5.3. CriandoJSONArray diretamente de uma coleção ou matriz

O construtor deJSONArray também oferece suporte a objetos de coleção e array como argumentos.

Simplesmente os passamos como um argumento para o construtor e ele retornará um objetoJSONArray:

List list = new ArrayList<>();
list.add("California");
list.add("Texas");
list.add("Hawaii");
list.add("Alaska");

JSONArray ja = new JSONArray(list);

Agora nossoJSONArray consiste em:

["California","Texas","Hawaii","Alaska"]

6. JSONTokener

UmJSONTokener pega uma fonteString como entrada para seu construtor e extrai caracteres e tokens dele. É usado internamente por classes deste pacote (comoJSONObject,JSONArray) para analisar JSONStrings.

Pode não haver muitas situações em que usaremos diretamente esta classe, pois a mesma funcionalidade pode ser alcançada usando outros métodos mais simples (comostring.toCharArray()):

JSONTokener jt = new JSONTokener("lorem");

while(jt.more()) {
    Log.info(jt.next());
}

Agora podemos acessar aJSONTokener como um iterador, usando o métodomore() para verificar se há algum elemento restante enext() para acessar o próximo elemento.

Os tokens recebidos do exemplo anterior serão:

l
o
r
e
m

7. CDL

Temos uma classeCDL (Comma Delimited List) para converter texto delimitado por vírgulas emJSONArray e vice-versa.

7.1. ProduzindoJSONArray diretamente do texto delimitado por vírgulas

Para produzir umJSONArray diretamente do texto delimitado por vírgulas, podemos usar o método estáticorowToJSONArray() que aceita umJSONTokener:

JSONArray ja = CDL.rowToJSONArray(new JSONTokener("England, USA, Canada"));

NossoJSONArray agora consiste em:

["England","USA","Canada"]

7.2. Produzindo Texto Delimitado por Vírgula de JSONArray

Para reverter a etapa anterior e recuperar o texto delimitado por vírgulas deJSONArray, podemos usar:

JSONArray ja = new JSONArray("[\"England\",\"USA\",\"Canada\"]");
String cdt = CDL.rowToString(ja);

OStringcdt agora contém:

England,USA,Canada

7.3. ProduzindoJSONArray deJSONObjects usando texto delimitado por vírgula

Para produzir umJSONArray deJSONObjects, usaremos um textoString contendo cabeçalhos e dados separados por vírgulas.

As diferentes linhas são separadas usando um retorno de carro( ) ou avanço de linha( ).

A primeira linha é interpretada como uma lista de cabeçalhos e todas as linhas subsequentes são tratadas como dados:

String string = "name, city, age \n" +
  "john, chicago, 22 \n" +
  "gary, florida, 35 \n" +
  "sal, vegas, 18";

JSONArray result = CDL.toJSONArray(string);

O objetoJSONArray result agora consiste em (saída formatada para fins de clareza):

[
    {
        "name": "john",
        "city": "chicago",
        "age": "22"
    },
    {
        "name": "gary",
        "city": "florida",
        "age": "35"
    },
    {
        "name": "sal",
        "city": "vegas",
        "age": "18"
    }
]

Observe que, neste exemplo, os dados e o cabeçalho foram fornecidos dentro do mesmoString.There’s an alternative way of doing this where we can achieve the same functionality by supplying a JSONArray that would be used to get the headers and a comma-delimited String working as the data.

Linhas diferentes são separadas usando um retorno de carro( ) ou avanço de linha( ):

JSONArray ja = new JSONArray();
ja.put("name");
ja.put("city");
ja.put("age");

String string = "john, chicago, 22 \n"
  + "gary, florida, 35 \n"
  + "sal, vegas, 18";

JSONArray result = CDL.toJSONArray(ja, string);

Aqui, obteremos o conteúdo do objetoresult exatamente como antes.

A classeCookie lida com cookies de navegador da web e tem métodos para converter um cookie de navegador emJSONObjecte vice-versa.

Aqui estão os principais métodos da classeCookie:

  1. toJsonObject(String sourceCookie) – converte uma string de cookie em umJSONObject

  2. toString(JSONObject jo) - este é o inverso do método anterior, converte umJSONObject em um cookieString.

Para converter um cookieString emJSONObject, usaremos o método estáticoCookie.toJSONObject():

String cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; path=/";
JSONObject cookieJO = Cookie.toJSONObject(cookie);

Agora vamos converter umJSONObject em cookieString. Isso é o reverso da etapa anterior:

String cookie = Cookie.toString(cookieJO);

9. HTTP

A classeHTTP contém métodos estáticos que são usados ​​para converter cabeçalhos HTTP emJSONObject e vice-versa.

Essa classe também possui dois métodos principais:

  1. toJsonObject(String sourceHttpHeader) – converte aHttpHeader String emJSONObject

  2. toString(JSONObject jo) - converte oJSONObject fornecido emString

9.1. ConvertendoJSONObject em cabeçalho HTTP

O métodoHTTP.toString() é usado para converter umJSONObject em um cabeçalho HTTPString:

JSONObject jo = new JSONObject();
jo.put("Method", "POST");
jo.put("Request-URI", "http://www.example.com/");
jo.put("HTTP-Version", "HTTP/1.1");
String httpStr = HTTP.toString(jo);

Aqui, nossoString httpStr consistirá em:

POST "http://www.example.com/" HTTP/1.1

Observe que, ao converter um cabeçalho de solicitação HTTP, oJSONObject deve conter“Method”,“Request-URI”e“HTTP-Version” chaves, enquanto, para o cabeçalho de resposta, o objeto deve conter“HTTP-Version”, Parâmetros“Status-Code”e“Reason-Phrase”.

9.2. Convertendo Cabeçalho HTTPString de volta paraJSONObject

Aqui, converteremos a string HTTP que obtivemos na etapa anterior de volta para oJSONObject que criamos nessa etapa:

JSONObject obj = HTTP.toJSONObject("POST \"http://www.example.com/\" HTTP/1.1");

10. JSONException

OJSONException é a exceção padrão lançada por este pacote sempre que algum erro é encontrado.

Isso é usado em todas as classes deste pacote. A exceção geralmente é seguida por uma mensagem que indica o que exatamente deu errado.

11. Conclusão

Neste tutorial, vimos um JSON usando Java -org.json - e nos concentramos em algumas das principais funcionalidades disponíveis aqui.

Os trechos de código completos usados ​​neste artigo podem ser encontradosover on GitHub.