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?



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

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

Wynik powinien wyglądać następująco: {"firstName":"Sample","lastName":"User","email":"sampleU@example.com"}


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

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

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


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.


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

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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.