Konvertieren von Java-Objekten in JSON mit Jackson


166

Ich möchte, dass mein JSON so aussieht:

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

Code bisher:

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

}

und

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

Mir fehlt nur der Teil, wie ich das Java-Objekt mit Jackson in JSON konvertieren kann:

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

Meine Frage ist: Sind meine Klassen korrekt? Welche Instanz muss ich aufrufen und wie kann ich diese JSON-Ausgabe erzielen?



Danke, das hat mir geholfen :)
JustTheAverageGirl

Wenn die Entität anderen Tabellen beigetreten ist, folgen Sie diesen Anweisungen. /programming/19928151/convert-entity-object-to-json/45695714#45695714
Sedat Y

Antworten:


417

So konvertieren Sie Ihre objectin JSON mit Jackson:

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

9
Die einzige Sache ist, dass der String aus dem ObjectWriter entkommen ist. Verwenden Sie: neues JSONObject (ow.writeValueAsString (msg)), wenn es über Webdienste wie RESTful gesendet wird.
jmarcosSF

Aus Interesse, warum ist es nicht os.writeValueAsJSONString (Objekt)?
DevilCode

3
Ich stehe vor diesem Fehler, wie man mit Ihrem Code löst. Kein Serializer für die Klasse com.liveprocessor.LPClient.LPTransaction gefunden und keine Eigenschaften zum Erstellen von BeanSerializer gefunden (um Ausnahmen zu vermeiden, deaktivieren Sie SerializationFeature.FAIL_ON_EMPTY_BEANS)

11
Bibliotheken übrigens: import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter;
Diego Matos - Keke

objectMUSS Getter für alle Felder haben, die Ihr JSON enthalten soll.
Drakonoved

25

Ich weiß, dass dies alt ist (und ich bin neu in Java), aber ich bin auf das gleiche Problem gestoßen. Und die Antworten waren mir nicht so klar wie einem Neuling ... also dachte ich, ich würde hinzufügen, was ich gelernt habe.

Ich habe eine Bibliothek eines Drittanbieters verwendet, um das Unternehmen zu unterstützen: org.codehaus.jackson Alle Downloads hierfür finden Sie hier .

Für die Basis-JSON-Funktionalität müssen Sie den Bibliotheken Ihres Projekts die folgenden Jars hinzufügen: jackson-mapper-asl und jackson-core-asl

Wählen Sie die Version, die Ihr Projekt benötigt. (Normalerweise können Sie mit dem neuesten stabilen Build arbeiten).

Fügen Sie importIhrem Code nach dem Import in die Bibliotheken Ihres Projekts die folgenden Zeilen hinzu:

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

Mit dem Java-Objekt definierte und zugewiesene Werte, die Sie in JSON konvertieren und als Teil eines RESTful-Webdienstes zurückgeben möchten

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

Das Ergebnis sollte folgendermaßen aussehen: {"firstName":"Sample","lastName":"User","email":"sampleU@example.com"}


Ich glaube, die 'Import'-Zeilen haben sich in "import com.fasterxml.jackson.databind.ObjectMapper;" geändert.
Barrypicker

16

Dies könnte nützlich sein:

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

mach das einfach

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

Was ist Response.ok?
Codeversed

Ich hatte ein Problem mit JSON-Größen, die in mongoDB eingefügt wurden und über dem zulässigen Grenzwert lagen, wenn ich einschalte, hat mein Gson-Objekt die größere Größe als bei Jackson. Nur ein Tipp.
Daniela Morais

14
Die Frage ist über jackson, nichtGson
Ean V

2
@Codeversed Response ist eine Klasse in der Jersey-Bibliothek. Response.ok wird JSON-Antwort mit dem Statuscode 200 zurückgeben.
Pranav

2

Nun, selbst die akzeptierte Antwort gibt nicht genau das aus, wonach op gefragt hat. Es gibt die JSON-Zeichenfolge aus, jedoch mit maskierten "Zeichen. Also, obwohl es vielleicht etwas spät ist, antworte ich in der Hoffnung, dass es den Menschen helfen wird! So mache ich das:

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

Hinweis: Damit die am häufigsten gewählte Lösung funktioniert, müssen Attribute im POJO publicöffentlich sein oder sein getter/ setter:

Standardmäßig funktioniert Jackson 2 nur mit Feldern, die entweder öffentlich sind oder über eine öffentliche Getter-Methode verfügen. Die Serialisierung einer Entität mit allen privaten Feldern oder privaten Paketen schlägt fehl.

Noch nicht getestet, aber ich glaube, dass diese Regel auch für andere JSON-Bibliotheken wie Google Gson gilt.


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

Zu viel Arbeit, zu viel Nachdenken! Mapper sollen dich von diesen Boilerplate-Sachen befreien!
Ean V

3
Ich liebe Konvektoren!
Christos

0

Sie können Google Gson so verwenden

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

Gson gson = new Gson();
String jsonStr = gson.toJson(user);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.