Gson? JSONObject!

Pessoal, andei pesquisando em como transformar uma String que vem em formato Json, para um Objeto, mas to achando esse Gson muito complicado, alguém já trabalhou com alguma outra API que efetuasse essas tarefas, se alguém tiver algum exemplo também seria muito útil ainda mais para um iniciante! =D

Brigadão pessoal.

Eu uso o Jackson e estou muito satisfeito com ele, posso serializar e desserializar objetos complexos facilmente.

Exemplo de serialização/desserialização com o Jackson:

[code]ObjectMapper mapper = new ObjectMapper();
Pessoa pessoa = new Pessoa();
pessoa.nome = “Adriel Café”;
pessoa.idade = 21;

// Serializando o POJO
string json = mapper.writeValueAsString(pessoa);

// Desserializand o POJO
Pessoa pessoa2 = mapper.readValue(json, Pessoa.class);[/code]

eu uso a jar do GSON do Google e é muito fácil! :slight_smile:

Com o Gson é o mesmo esquema:

Se você for receber a String {“numero”:1,“texto”:“string”} é só criar a classe com os mesmos atributos:

public class Coisa {
    private int numero;
    private String texto;
}

Então para desserializar:

Gson gson = new Gson();
String json = "{\"numero\":1,\"texto\":\"string\"}";
Coisa coisaDesserializada = gson.fromJson(json, Coisa.class);

Eu uso o proprio JSONObject que faz parte da API do Android.

DWR -> Em cima da classe de entidade @DataTransferObject

pelo menos pra web e javascript

ve se no seu caso encaixa pra ME

Pessoal eu tenho um JSON assim:

{"locations":[{"id":1,"created_at":"2012-02-09T09:39:10-02:00","longitude":"123.0","updated_at":"2012-02-09T09:39:10-02:00","latitude":"123.0", "date":"2012-02-09T09:39:10-02:00","account_id":1}],"item":{"id":12,"updated_at":"2012-02-09T09:37:45-02:00","visibility":1,"status":"Waiting", "address":"asd","description":"asd","name":"asd","owner_id":1,"group_id":null,"created_at":"2012-02-09T09:37:45-02:00","code":"hOPioi0io", "date":"2012-02-09T09:37:45-02:00"}}

e quando eu tento:

ele joga essa exception:

org.json.JSONException: Value {"locations":[{"id":1,"created_at":"2012-02-09T09:39:10-02:00","longitude":"123.0","updated_at":"2012-02-09T09:39:10-02:00","latitude":"123.0", "date":"2012-02-09T09:39:10-02:00","account_id":1}],"item":{"id":12,"updated_at":"2012-02-09T09:37:45-02:00","visibility":1,"status":"Waiting", "address":"asd","description":"asd","name":"asd","owner_id":1,"group_id":null,"created_at":"2012-02-09T09:37:45-02:00","code":"hOPioi0io", "date":"2012-02-09T09:37:45-02:00"}} of type org.json.JSONObject cannot be converted to JSONArray

Para ter esse Array.

JSONObject obj = new JSONObject(jsonString);
JSONArray array = obj.getJSONArray("locations");

Isto funcionou, porém estou tentando acessar um dos "atributos" do meu Objeto JSON para pegar seu valor, mas no entanto isso não está funcionando! Continua dando erro (linha identificada no códgio)

Estou tentando algo assim:

                  [code]  objectJson = new JSONObject(jsonString);
		arrayJson = objectJson.getJSONArray("item"); // < Erro aqui
		opLocation.setText(arrayJson.toString());[/code]

Segue a Stack do erro:

EDITED

Pessoal realmente to apanhando bastante pra isso, tentei fazer isso aqui com o Gson, mas ta dando erro no formato da data de "created_at"!

[code]GsonBuilder gsb = new GsonBuilder();
Gson g = gsb.create();

    JSONObject objectJson = null;
    ItemHolder i = null;
    
    try {
        objectJson = new JSONObject(getItemsList());
        //i = g.fromJson(objectJson.toString(), ItemHolder.class); << ERRO
        //opLocation.setText(i.getAddress());

    }
    catch (JSONException e) {
        e.printStackTrace();
    }[/code]

Stack do erro

Como eu disse ele não entende esse formato de data como eu altero isso?

Olha seu JSON

{
    "locations": [{
        "id": 1,
        "created_at": "2012-02-09T09:39:10-02:00",
        "longitude": "123.0",
        "updated_at": "2012-02-09T09:39:10-02:00",
        "latitude": "123.0",
        "date": "2012-02-09T09:39:10-02:00",
        "account_id": 1
    }],
    "item": {
        "id": 12,
        "updated_at": "2012-02-09T09:37:45-02:00",
        "visibility": 1,
        "status": "Waiting",
        "address": "asd",
        "description": "asd",
        "name": "asd",
        "owner_id": 1,
        "group_id": null,
        "created_at": "2012-02-09T09:37:45-02:00",
        "code": "hOPioi0io",
        "date": "2012-02-09T09:37:45-02:00"
    }
}

item é um JSONObject e não um JSONArray.

Entendi agora, Marky, brigadão pela ajuda e paciencia, agora acho que vou conseguir traduzir o meu Json, mas antes vou ter que arrumar de onde estou pegando o JSON, qual quer coisa reabro o tópico, mas por enquanto >> RESOLVIDO! =D

Pessoal tenho novos problemas, com o Json, esotu tentando criar um JSONObject passando uma String JSON, mas ele simplesmente não cria o objeto e depois diz que é nula.

Segue o fonte:

JSON String:

(Site bom para organizar o JSON > http://jsonviewer.stack.hu/)

Ele estoura uma NPE quando eu tento:

EDITED

Consegui resover o problema acima passando para um JSONArray.

E agora consigo pegar os JSON’s e tal, mas não estou conseguindo pegar os valores especificos, tipo “nome”, “endereço” … para depois atribiuí-las ao meu objeto com estes atributos.
Brigadão pessoal.

Repara na estrutura do seu JSON:

[{
    "item": {
        "address": "asd",
        "code": "hOPioi0io",
        "created_at": "2012-02-09T09:37:45-02:00",
        "date": "2012-02-09T09:37:45-02:00",
        "description": "asd",
        "group_id": null,
        "id": 12,
        "name": "asd",
        "owner_id": 1,
        "status": "Waiting",
        "updated_at": "2012-02-09T09:37:45-02:00",
        "visibility": 1
    },
    "locations": [{
        "account_id": 1,
        "created_at": "2012-02-09T09:39:10-02:00",
        "date": "2012-02-09T09:39:10-02:00",
        "id": 1,
        "latitude": "123.0",
        "longitude": "123.0",
        "updated_at": "2012-02-09T09:39:10-02:00"
    }, {
        "account_id": 1,
        "created_at": "2012-02-09T15:15:24-02:00",
        "date": "2012-02-09T15:15:24-02:00",
        "id": 2,
        "latitude": "146.0",
        "longitude": "213.0",
        "updated_at": "2012-02-09T15:15:24-02:00"
    }]
}, {
    "item": {
        "address": "Francisco da fontoura",
        "code": "wG5NNSq9A",
        "created_at": "2012-02-09T16:30:20-02:00",
        "date": "2012-02-09T16:30:20-02:00",
        "description": "testeaee",
        "group_id": null,
        "id": 13,
        "name": "testearr",
        "owner_id": 1,
        "status": "Waiting",
        "updated_at": "2012-02-10T12:45:34-02:00",
        "visibility": 1
    },
    "locations": [{
        "account_id": 1,
        "created_at": "2012-02-09T15:15:24-02:00",
        "date": "2012-02-09T15:15:24-02:00",
        "id": 2,
        "latitude": "146.0",
        "longitude": "213.0",
        "updated_at": "2012-02-09T15:15:24-02:00"
    }, {
        "account_id": 1,
        "created_at": "2012-02-09T09:39:10-02:00",
        "date": "2012-02-09T09:39:10-02:00",
        "id": 1,
        "latitude": "123.0",
        "longitude": "123.0",
        "updated_at": "2012-02-09T09:39:10-02:00"
    }]
}]

Esse JSON é um JSONArray.

Cada JSONObject do Array equivale a:

{
    "item": {
        "address": "asd",
        "code": "hOPioi0io",
        "created_at": "2012-02-09T09:37:45-02:00",
        "date": "2012-02-09T09:37:45-02:00",
        "description": "asd",
        "group_id": null,
        "id": 12,
        "name": "asd",
        "owner_id": 1,
        "status": "Waiting",
        "updated_at": "2012-02-09T09:37:45-02:00",
        "visibility": 1
    },
    "locations": [{
        "account_id": 1,
        "created_at": "2012-02-09T09:39:10-02:00",
        "date": "2012-02-09T09:39:10-02:00",
        "id": 1,
        "latitude": "123.0",
        "longitude": "123.0",
        "updated_at": "2012-02-09T09:39:10-02:00"
    }, {
        "account_id": 1,
        "created_at": "2012-02-09T15:15:24-02:00",
        "date": "2012-02-09T15:15:24-02:00",
        "id": 2,
        "latitude": "146.0",
        "longitude": "213.0",
        "updated_at": "2012-02-09T15:15:24-02:00"
    }]
},

Onde voce tem o JSONObject item:

 {
        "address": "asd",
        "code": "hOPioi0io",
        "created_at": "2012-02-09T09:37:45-02:00",
        "date": "2012-02-09T09:37:45-02:00",
        "description": "asd",
        "group_id": null,
        "id": 12,
        "name": "asd",
        "owner_id": 1,
        "status": "Waiting",
        "updated_at": "2012-02-09T09:37:45-02:00",
        "visibility": 1
    }

Onde voce poderia pegar os atributos com os getString/Long/Boolean/etc.

E locations é um JSONArray onde cada JSONObject é:

{
        "account_id": 1,
        "created_at": "2012-02-09T09:39:10-02:00",
        "date": "2012-02-09T09:39:10-02:00",
        "id": 1,
        "latitude": "123.0",
        "longitude": "123.0",
        "updated_at": "2012-02-09T09:39:10-02:00"
    }