Convertir objetos Java a JSON con Jackson


166

Quiero que mi JSON se vea así:

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

Código hasta ahora:

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);
    }

}

y

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);
    }
}

Solo me falta la parte de cómo puedo convertir el objeto Java a JSON con Jackson:

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

Mi pregunta es: ¿son correctas mis clases? ¿A qué instancia debo llamar y cómo puedo lograr esta salida JSON?



Gracias, eso me ayudó :)
JustTheAverageGirl

si la entidad se unió a otras tablas, siga este camino ... /programming/19928151/convert-entity-object-to-json/45695714#45695714
Sedat Y

Respuestas:


417

Para convertir tu objecten JSON con Jackson:

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(object);

9
Lo único es que el String sale escapado del ObjectWriter. Utilice: nuevo JSONObject (ow.writeValueAsString (msg)) si se envía a través de servicios web como RESTful.
jmarcosSF 23/03/2015

Fuera de interés, ¿por qué no es os.writeValueAsJSONString (objeto)?
DevilCode

3
Me enfrento a este error, cómo resolverlo con su código No se encontró ningún serializador para la clase com.liveprocessor.LPClient.LPTransaction y no se descubrieron propiedades para crear BeanSerializer (para evitar excepciones, deshabilite SerializationFeature.FAIL_ON_EMPTY_BEANS)

11
bibliotecas por cierto: import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter;
diego matos - keke

objectDEBE tener captadores para todos los campos, que desea que incluya su JSON.
Drakonoved

25

Sé que esto es antiguo (y soy nuevo en Java), pero me encontré con el mismo problema. Y las respuestas no fueron tan claras para mí como un novato ... así que pensé en agregar lo que aprendí.

Utilicé una biblioteca de terceros para ayudar en el esfuerzo: org.codehaus.jackson todas las descargas para esto se pueden encontrar aquí .

Para la funcionalidad JSON básica, debe agregar los siguientes archivos jar a las bibliotecas de su proyecto: jackson-mapper-asl y jackson-core-asl

Elija la versión que necesita su proyecto. (Por lo general, puede ir con la última versión estable).

Una vez que se importen a las bibliotecas de su proyecto, agregue las siguientes importlíneas a su código:

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

Con el objeto Java definido y los valores asignados que desea convertir a JSON y devolver como parte de un servicio web RESTful

User u = new User();
u.firstName = "Sample";
u.lastName = "User";
u.email = "sampleU@example.com";

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();
}

El resultado debería verse así: {"firstName":"Sample","lastName":"User","email":"sampleU@example.com"}


Creo que las líneas 'importar' han cambiado a "import com.fasterxml.jackson.databind.ObjectMapper;"
barrypicker

16

Esto puede 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));

10

solo haz esto

 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();

¿Qué es Response.ok?
Codeversed

Tuve un problema con los tamaños JSON insertados en mongoDB estaban por encima del límite permitido, cuando enciendo mi objeto Gson tiene el tamaño más grande que con Jackson. Solo un consejo.
Daniela Morais

14
La pregunta es sobre jackson, noGson
Ean V

2
@Codeversed Response es una clase en la biblioteca de Jersey. Response.ok devolverá la respuesta JSON con el código de estado 200.
Pranav

2

Bueno, incluso la respuesta aceptada no genera exactamente lo que op ha pedido. Produce la cadena JSON pero con "caracteres escapados. Entonces, aunque podría ser un poco tarde, ¡estoy respondiendo con la esperanza de que ayude a las personas! Así es como lo hago:

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


2

Nota: Para que la solución más votada funcione, los atributos en el POJO deben ser publico tener un público getter/ setter:

De manera predeterminada, Jackson 2 solo funcionará con campos que sean públicos o que tengan un método getter público; la serialización de una entidad que tiene todos los campos privados o paquetes privados fallará.

Todavía no se ha probado, pero creo que esta regla también se aplica a otras bibliotecas JSON como Google Gson.


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();
    }
}

¡Demasiado trabajo, demasiada reflexión! ¡Se supone que los mapeadores te liberan de hacer estas cosas repetitivas!
Ean V

3
¡Amo a los convectores!
Christos

0

Puedes usar Google Gson así

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

Gson gson = new Gson();
String jsonStr = gson.toJson(user);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.