2012-09-21 14 views
10

Chcę przenieść z org.json do org.codehaus.jackson. Jak przekonwertować poniższy kod Java?Od org.json JSONObject do org.codehaus.jackson

private JSONObject myJsonMessage(String message){ 
    JSONObject obj = new JSONObject(); 
    obj.put("message",message); 
    return obj; 
} 

Zostawiłem blok try-catch dla uproszczenia.

Odpowiedz

19

Zamiast JSONObject użycie Jacksona ObjectMapper i ObjectNode:

ObjectMapper mapper = new ObjectMapper(); 
ObjectNode node = mapper.createObjectNode(); 
node.put("message", "text"); 

Byłoby to równoznaczne Jacksona z aktualnym kodem org.json.

Jednak Jackson naprawdę potrafi tworzyć złożone odwzorowania między klasami Java (POJO) i ich reprezentacją JSON, a także jego streaming API, który pozwala na naprawdę szybką serializację, przynajmniej w porównaniu z org.json w odpowiednikach.

+0

Więc 'jacksonObj' będzie moim obiektem zwrotu? – kasavbere

+0

Z wszystkimi podpowiedziami dotyczącymi jacksona miałem nadzieję, że org.codehaus.jackson będzie prostsze niż org.json. Up-głosuj za pomoc. – kasavbere

+0

@kasavbere: Edytowałem swoją odpowiedź, aby lepiej odzwierciedlić pierwotne pytanie. Jeśli chodzi o prostotę, nie jest to takie proste, ale zależy to od tego, co chcesz z nim zrobić. Dla uproszczenia serializacji prostsze jest użycie 'org.json'.Jednakże, jeśli wykonujesz duże serializacje obiektów i masz jakieś niestandardowe potrzeby (na przykład serializujesz pole 'Date' jako wartość' String'), Jackson jest zdecydowanie najlepszą opcją, imho. –

5

Nie ma JSONObject w api Jackson. Zamiast zwracania wartości JSONObject można zwrócić mapę lub komponent bean Java z właściwością komunikatu, która ma dla niej wartości pobierające i ustawiające.

public class MyMessage { 
    private String message; 

    public void setMessage(final String message) { 
     this.message = message; 
    } 

    public String getMessage() { 
     return this.message; 
    } 
} 

Więc metoda zostanie zmniejszona do:

private MyMessage(String message) { 
    MyMessage myMessage = new MyMessage(); 
    myMessage.setMessage(message); 
    return myMessage; 
} 

Innym aspektem tej zmiany będą zmiany kodu serializacji, konwertować MyMessage powrotem do json ciąg. Jackson robi Java Beans, mapy domyślnie, nie trzeba utworzyć JSONObject np

private String serializeMessage(MyMessage message){ 

    //Note: you probably want to put it in a global converter and share the object mapper 
    ObjectMapper mapper = new ObjectMapper(); 
    return mapper.writeValueAsString(message); 
} 

Powyższy powróci {message: "some message"}

I odpuściliśmy wyjątki dla zwięzłości.

+0

Z wszystkimi podpowiedziami dotyczącymi jacksona miałem nadzieję, że org.codehaus.jackson będzie prostszy niż org.json. Up-głosuj za pomoc. – kasavbere

+0

Jak wspomniano wcześniej, istnieje odpowiednik jednak: albo 'JsonNode' (typ podstawowy) albo' ObjectNode' (jako określony podtyp obiektu JSON). W przeciwieństwie do org.json, istnieje dziedziczenie węzła dla prawidłowego dostępu do OO. – StaxMan

1

Jeśli chcesz uaktualnić bibliotekę org.json do Jackson kawałek po kawałku i początkowo zachowując ten sam interfejs API, możesz przeczytać "Upgrade from org.json to Jackson". To sprawiłoby, że twój kod byłby około 3 razy szybszy dla podstawowego czytania i pisania JSON; plus możesz - jeśli tak sobie wybierz - zacząć przetwarzanie konwersji, ponieważ Jackson ułatwia konwersję między drzewami i obiektami POJO (ObjectMapper.treeToValue(...), valueToTree, convertValue między obiektami POJO itp. itp.).

Pamiętaj, że narzędzia, które znasz, mogą wpływać na twoje myślenie na pewne wzorce, a zachowanie otwartego umysłu może pomóc ci znaleźć jeszcze lepsze. W przypadku Jacksona (lub GSON lub innych dojrzałych narzędzi JSON Java), naprawdę powinieneś rozważyć, gdzie może pomóc właściwe wiązanie danych, zamiast używać modelu drzewa z centrowaniem JSON (który oferuje org.json). Modele Drzewne podtrzymują twoje myślenie na podstawie struktury JSON, która czasami jest przydatna; ale może również uniemożliwić zobaczenie bardziej naturalnych wzorców, które wynikają z definiowania struktury POJO, aby odzwierciedlać oczekiwany JSON i bezpośrednio działać na obiektach Java.

Powiązane problemy