sábado, 9 de junho de 2012

JSON em Java

Um framework bastante conhecido para trabalhar com JSON em Java é o Jackson. Tudo que vocë precisa fazer é importar 2 jars para o seu projeto e comecar a utilizá-lo. Eles podem ser encontrados em:

http://mvnrepository.com/artifact/org.codehaus.jackson/jackson-core-asl
http://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl

Para transformar objetos comuns Java em JSON, basta fazer:

import java.io.PrintWriter;
import java.io.StringWriter;
import org.codehaus.jackson.map.ObjectMapper;

public static String toJson(Object obj) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    StringWriter jsonValue = new StringWriter();
    mapper.writeValue(new PrintWriter(jsonValue), obj);
    return jsonValue.toString();
}
Para transformar um objeto representado em JSON para um objeto em java, basta fazer:

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.MappingJsonFactory;

public static Object fromJson(String json, Class objectClass) throws Exception {
    JsonFactory f = new MappingJsonFactory();
    JsonParser jp = f.createJsonParser(json);
    Object obj = jp.readValueAs(objectClass);
    return obj;
}
Criando uma classe Pagina, teríamos o seguinte:

public class Pagina {

    private Long id;
    private int numero;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    public int getNumero() {
        return numero;
    }
    public void setNumero(int numero) {
        this.numero = numero;
    }

    public String toString() {
        return "Pagina [" id=" + id + " ,numero=" + numero + "]";
    }
}
A representação de um objeto Pagina poderia ser:

{"numero" : 1,"id" : 1}
Agora, executando o método:

public static void main(String[] args) {
    try{
        System.out.println(fromJson("{\"numero\" : 1,\"id\" : 1}", Pagina.class));
    }catch(Exception e){
        e.printStackTrace();
    }
}
Imaginando outra situação, talvez você não tenha a classe que representa o conteúdo de determinado JSON. Nesse caso, a melhor forma é tratar o JSON como ele realmente é, ou seja, como um Mapa de String com objeto.

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;

public static Map fromJson(String json) throws Exception {
   ObjectMapper jsonMapper = new ObjectMapper();
   Map meta = jsonMapper.readValue(json, new TypeReference>() { });	    		
   return meta;
}

Nenhum comentário:

Postar um comentário