Konwersja obiektów Java do JSON za pomocą Jacksona

166

Chcę, aby mój JSON wyglądał tak:

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

Dotychczasowy kod:

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

}

i

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

Brakuje mi tylko części, w której mogę przekonwertować obiekt Java na JSON z Jacksonem:

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

Moje pytanie brzmi: czy moje zajęcia są prawidłowe? Którą instancję mam wywołać i jak mogę uzyskać dane wyjściowe JSON?

JustTheA AverageGirl
źródło
4
Poniższy samouczek może pomóc: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
maple_shaft Kwietnia
Dzięki, że mi pomogło :)
JustTheA AverageGirl
jeśli jednostka dołączyła do innych tabel, postępuj w ten sposób. /programming/19928151/convert-entity-object-to-json/45695714#45695714
Sedat Y

Odpowiedzi:

417

Aby przekonwertować objectw JSON z Jacksonem:

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(object);
Jean Logeart
źródło
9
Jedyną rzeczą jest to, że String wychodzi z ucieczki z ObjectWriter. Użyj: nowy JSONObject (ow.writeValueAsString (msg)), jeśli jest wysyłany za pośrednictwem usług internetowych, takich jak RESTful.
jmarcosSF
W interesie, dlaczego nie jest to os.writeValueAsJSONString (obiekt)?
DevilCode
3
Mam do czynienia z tym błędem, jak rozwiązać za pomocą twojego kodu Nie znaleziono serializatora dla klasy com.liveprocessor.LPClient.LPTransaction i nie wykryto żadnych właściwości do utworzenia BeanSerializer (aby uniknąć wyjątku, wyłącz SerializationFeature.FAIL_ON_EMPTY_BEANS))
11
biblioteki przy okazji: import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter;
diego matos - keke
objectMUSI mieć metody pobierające dla wszystkich pól, które chcesz, aby zawierał JSON.
Drakonoved
25

Wiem, że to jest stare (i jestem nowy w Javie), ale napotkałem ten sam problem. A odpowiedzi nie były dla mnie tak jasne jak nowicjusz ... więc pomyślałem, że dodam to, czego się nauczyłem.

Użyłem biblioteki innej firmy, aby pomóc w przedsięwzięciu: org.codehaus.jackson wszystkie pliki do pobrania do tego można znaleźć tutaj .

Aby uzyskać podstawową funkcjonalność JSON, musisz dodać następujące pliki JAR do bibliotek projektu: jackson-mapper-asl i jackson-core-asl

Wybierz wersję, której potrzebuje Twój projekt. (Zwykle możesz skorzystać z najnowszej stabilnej wersji).

Po zaimportowaniu ich do bibliotek projektu dodaj importdo kodu następujące wiersze:

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

Ze zdefiniowanym obiektem Java i przypisanymi wartościami, które chcesz przekonwertować do formatu JSON i zwrócić jako część usługi internetowej zgodnej z REST

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

Wynik powinien wyglądać następująco: {"firstName":"Sample","lastName":"User","email":"[email protected]"}

f10orf12
źródło
Uważam, że wiersze „importu” zmieniły się na „import com.fasterxml.jackson.databind.ObjectMapper;”
barrypicker
16

Może to być przydatne:

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
źródło
10

po prostu zrób to

 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
źródło
Czym jest Response.ok?
Odwrócono kod
Miałem problem z rozmiarami JSON wstawionymi do mongoDB powyżej dozwolonego limitu, gdy włączam mój obiekt Gson ma większy rozmiar niż w przypadku Jacksona. Tylko wskazówka.
Daniela Morais
14
Pytanie dotyczy jackson, a nieGson
Ean V
2
@Codeversed Response to klasa w bibliotece Jersey. Response.ok zwróci odpowiedź JSON z kodem stanu 200.
Pranav
2

Cóż, nawet zaakceptowana odpowiedź nie daje dokładnie tego, o co prosił op. Wyprowadza ciąg JSON, ale ze "znakami ucieczki. Tak więc, chociaż może być trochę za późno, odpowiadam, mając nadzieję, że pomoże to ludziom! Oto jak to robię:

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
źródło
2

Możesz to zrobić:

String json = new ObjectMapper().writeValueAsString(yourObjectHere);
Clayton KN Passos
źródło
Zawsze lubię odpowiedzi w jednej linii.
Kishan Solanki
2

Uwaga: aby rozwiązanie z największą liczbą głosów działało, atrybuty w POJO muszą być publicpubliczne getter/ setter:

Domyślnie Jackson 2 działa tylko z polami, które są publiczne lub mają publiczną metodę pobierania - serializacja jednostki, która ma wszystkie pola prywatne lub prywatne, zakończy się niepowodzeniem.

Jeszcze nie testowane, ale uważam, że ta reguła dotyczy również innych bibliotek JSON, takich jak Google Gson.

ZhaoGang
źródło
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
źródło
Za dużo pracy, za dużo refleksji! Twórcy map powinni uwolnić cię od robienia tych podstawowych rzeczy!
Ean V
3
Uwielbiam konwektory!
Christos
0

Możesz używać Google Gson w ten sposób

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

Gson gson = new Gson();
String jsonStr = gson.toJson(user);
Ven Ren
źródło