2014-06-30 12 views
8

Podczas wywołania usługi internetowej chciałbym zwrócić moje obiekty z tą strukturą JSON.Dostosowywanie serializacji JSON przy użyciu JaxRS

{ 
    "date" : "30/06/2014", 
    "price" : { 
    "val" : "12.50", 
    "curr" : "EUR" 
    } 
} 

Chciałbym map ten kod JSON do tej struktury Java (z joda-time i joda-money):

public class MyResponse { 
    LocalDate date; 
    Money price; 
} 

Moja usługa aktualnie wygląda tak:

@javax.ws.rs.POST 
@javax.ws.rs.Path("test") 
@javax.ws.rs.Produces({MediaType.APPLICATION_JSON}) 
@javax.ws.rs.Consumes({MediaType.APPLICATION_JSON}) 
public MyResponse test(MyRequest request) { 
    MyResponse response = new MyResponse(); 
    response.setDate(LocalDate.now()); 
    response.setMoney(Money.parse("EUR 12.50")); 
    return response; 
} 

więc moja Pytanie brzmi: gdzie mogę zarejestrować niestandardową procedurę obsługi, aby formatować daty tak, jak chcę, a także prezentacje pieniędzy?

+0

Wierzę, że implementacja Jax RS używa pewnej biblioteki do obsługi JSON. Na przykład Spring używa 'Jackson' do tego celu, i zazwyczaj gdy potrzebujesz niestandardowej serializacji, wystarczy skonfigurować zachowanie serializacji używając' Jackson' APIs – WelcomeTo

+0

Ramy użyte wydają się być 'org.jboss.resteasy: jaxrs-api: jar: 2.1. 0.GA: provided'. Biorąc to pod uwagę, myślę, że używa on standardowego serializera JBoss 6 JSon, ale nie mogę znaleźć tego, który jest. –

Odpowiedz

8

Jeśli używasz Jackson (który powinien być domyślny dla JBoss EAP 6) można użyć niestandardowego JsonSerializers

Dla LocalDate:

public class DateSerializer extends JsonSerializer<LocalDate> { 

    @Override 
    public void serialize(LocalDate date, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
     jgen.writeString(date.toString("dd/MM/yyyy")); 
    } 

} 

Dla Money:

public class MoneySerializer extends JsonSerializer<Money> { 

    @Override 
    public void serialize(Money money, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
     jgen.writeStartObject(); 
     jgen.writeStringField("val", money.getAmount().toString()); 
     jgen.writeStringField("curr", money.getCurrencyUnit().getCurrencyCode()); 
     jgen.writeEndObject(); 
    } 

} 

Oba Serializery mogą być rejestrowane globalnie:

Do parsowania JSON w tym niestandardowym formacie należy zaimplementować niestandardowe JsonDeserializers.

Jeśli używasz Jettison możesz zrobić to samo z niestandardowym XmlAdapters.

+0

Świetnie, spróbuję tego! –

+0

To jest świetny trop, dzięki któremu mogę pracować, dzięki! –

+0

Czy można dostosować serializację bez znajomości implementacji? Chcę pozostać kompatybilnym z dowolnym serwerem JEe – wutzebaer

Powiązane problemy