Convertendo objetos Java em JSON com Jackson

166

Quero que meu JSON fique assim:

{
    "information": [{
        "timestamp": "xxxx",
        "feature": "xxxx",
        "ean": 1234,
        "data": "xxxx"
    }, {
        "timestamp": "yyy",
        "feature": "yyy",
        "ean": 12345,
        "data": "yyy"
    }]
}

Código até agora:

import java.util.List;

public class ValueData {

    private List<ValueItems> information;

    public ValueData(){

    }

    public List<ValueItems> getInformation() {
        return information;
    }

    public void setInformation(List<ValueItems> information) {
        this.information = information;
    }

    @Override
    public String toString() {
        return String.format("{information:%s}", information);
    }

}

e

public class ValueItems {

    private String timestamp;
    private String feature;
    private int ean;
    private String data;


    public ValueItems(){

    }

    public ValueItems(String timestamp, String feature, int ean, String data){
        this.timestamp = timestamp;
        this.feature = feature;
        this.ean = ean;
        this.data = data;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getFeature() {
        return feature;
    }

    public void setFeature(String feature) {
        this.feature = feature;
    }

    public int getEan() {
        return ean;
    }

    public void setEan(int ean) {
        this.ean = ean;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return String.format("{timestamp:%s,feature:%s,ean:%s,data:%s}", timestamp, feature, ean, data);
    }
}

Só faltava a parte de como converter o objeto Java em JSON com Jackson:

public static void main(String[] args) {
   // CONVERT THE JAVA OBJECT TO JSON HERE
    System.out.println(json);
}

Minha pergunta é: Minhas aulas estão corretas? Qual instância devo chamar e como posso obter essa saída JSON?

JustTheAverageGirl
fonte
4
O tutorial a seguir podem ajudar: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
maple_shaft
Graças que me ajudaram :)
JustTheAverageGirl
se a entidade se juntou a outras tabelas, em seguida, siga este caminho .. /programming/19928151/convert-entity-object-to-json/45695714#45695714
Sedat Y

Respostas:

417

Para converter seu objectem JSON com Jackson:

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(object);
Jean Logeart
fonte
9
A única coisa é que a String sai escapada do ObjectWriter. Use: new JSONObject (ow.writeValueAsString (msg)) se estiver sendo enviado via Serviços da Web como RESTful.
jmarcosSF
Fora de interesse, por que não é os.writeValueAsJSONString (objeto)?
DevilCode 8/15
3
Eu estou enfrentando esse erro, como resolver com o seu código Sem serializer encontrados para com.liveprocessor.LPClient.LPTransaction classe e sem propriedades descoberto para criar BeanSerializer (a exceção evitar, desativar SerializationFeature.FAIL_ON_EMPTY_BEANS))
11
bibliotecas a propósito: import com.fasterxml.jackson.databind.ObjectMapper; importar com.fasterxml.jackson.databind.ObjectWriter;
diego matos - keke
objectDEVE ter getters para todos os campos, que você deseja que seu JSON inclua.
Drakonoved 25/09
25

Eu sei que isso é antigo (e eu sou novo no java), mas me deparei com o mesmo problema. E as respostas não eram tão claras para mim quanto um novato ... então pensei em acrescentar o que aprendi.

Eu usei uma biblioteca de terceiros para ajudar no empreendimento: org.codehaus.jackson todos os downloads para isso podem ser encontrados aqui .

Para a funcionalidade JSON básica, você precisa adicionar os seguintes jars às bibliotecas do seu projeto: jackson-mapper-asl e jackson-core-asl

Escolha a versão que seu projeto precisa. (Normalmente, você pode usar a versão estável mais recente).

Depois de importados para as bibliotecas do seu projeto, adicione as seguintes importlinhas ao seu código:

 import org.codehaus.jackson.JsonGenerationException;
 import org.codehaus.jackson.map.JsonMappingException;
 import org.codehaus.jackson.map.ObjectMapper;

Com o objeto java definido e valores atribuídos que você deseja converter para JSON e retornar como parte de um serviço da web RESTful

User u = new User();
u.firstName = "Sample";
u.lastName = "User";
u.email = "[email protected]";

ObjectMapper mapper = new ObjectMapper();

try {
    // convert user object to json string and return it 
    return mapper.writeValueAsString(u);
}
catch (JsonGenerationException | JsonMappingException  e) {
    // catch various errors
    e.printStackTrace();
}

O resultado deve ficar assim: {"firstName":"Sample","lastName":"User","email":"[email protected]"}

f10orf12
fonte
Eu acredito que as linhas 'import' foram alteradas para "import com.fasterxml.jackson.databind.ObjectMapper;"
barrypicker
16

Isso pode ser útil:

objectMapper.writeValue(new File("c:\\employee.json"), employee);

// display to console
Object json = objectMapper.readValue(
     objectMapper.writeValueAsString(employee), Object.class);

System.out.println(objectMapper.writerWithDefaultPrettyPrinter()
     .writeValueAsString(json));
Vicky
fonte
10

apenas faça isso

 for jackson it's
         ObjectMapper mapper = new ObjectMapper();  
         return mapper.writeValueAsString(object);
         //will return json in string


 for gson it's:
            Gson gson = new Gson();
            return Response.ok(gson.toJson(yourClass)).build();
Shell Scott
fonte
O que é o Response.ok?
Codeversed
Eu tive um problema com os tamanhos JSON inseridos no mongoDB que estavam acima do limite permitido, quando ligo meu objeto Gson com o tamanho maior do que com Jackson. Apenas uma dica.
Daniela Morais
14
A questão é sobre jackson, nãoGson
Ean V
2
O @Codeversed Response é uma classe da biblioteca de Jersey. O Response.ok retornará a resposta JSON com o código de status 200.
Pranav
2

Bem, mesmo a resposta aceita não gera exatamente o que o op pediu. Ele gera a sequência JSON, mas com "caracteres escapados. Portanto, embora possa ser um pouco tarde, estou respondendo, esperando que isso ajude as pessoas! Aqui está como eu faço isso:

StringWriter writer = new StringWriter();
JsonGenerator jgen = new JsonFactory().createGenerator(writer);
jgen.setCodec(new ObjectMapper());
jgen.writeObject(object);
jgen.close();
System.out.println(writer.toString());
Ean V
fonte
2

Você poderia fazer isso:

String json = new ObjectMapper().writeValueAsString(yourObjectHere);
Clayton KN Passos
fonte
Eu sempre gosto de respostas alinhadas.
Kishan Solanki 07/07
2

Nota: Para que a solução mais votada funcione, os atributos no POJO devem ser publicou ter um público getter/ setter:

Por padrão, o Jackson 2 funcionará apenas com campos que são públicos ou têm um método público getter - a serialização de uma entidade que possui todos os campos privados ou o pacote privado falhará.

Ainda não testado, mas acredito que esta regra também se aplica a outras bibliotecas JSON como o google Gson.

ZhaoGang
fonte
0
public class JSONConvector {

    public static String toJSON(Object object) throws JSONException, IllegalAccessException {
        String str = "";
        Class c = object.getClass();
        JSONObject jsonObject = new JSONObject();
        for (Field field : c.getDeclaredFields()) {
            field.setAccessible(true);
            String name = field.getName();
            String value = String.valueOf(field.get(object));
            jsonObject.put(name, value);
        }
        System.out.println(jsonObject.toString());
        return jsonObject.toString();
    }


    public static String toJSON(List list ) throws JSONException, IllegalAccessException {
        JSONArray jsonArray = new JSONArray();
        for (Object i : list) {
            String jstr = toJSON(i);
            JSONObject jsonObject = new JSONObject(jstr);
            jsonArray.put(jsonArray);
        }
        return jsonArray.toString();
    }
}
Artavazd Manukyan
fonte
Muito trabalho, muita reflexão! Os mapeadores devem libertá-lo de fazer essas coisas clichê!
EAN V
3
Eu amo convectores!
Christos
0

Você pode usar o Google Gson assim

UserEntity user = new UserEntity();
user.setUserName("UserName");
user.setUserAge(18);

Gson gson = new Gson();
String jsonStr = gson.toJson(user);
Ven Ren
fonte