2016-06-29 9 views
1

Ich benutze Retrofit 2.1 und Jackson in einer Android-App, um einen Post-Anruf zu einem Dienst zu machen, der Jackson zur Deserialisierung verwendet. Der Service wird erwartet, dass die eingehende json aussehen:Einfügen von Anmerkungen in Retrofit-Anfrage für Jackson

{"@class":"com.servicepackagepath$OurClassName","prop1":"value1","prop2":"value2"} 

jedoch die json das ist erzeugt immer und an den Dienst gesendet wird, ist:

{"prop1":"value1","prop2":"value2"} 

was zu einem 500. Der Nachrüst Signatur wie folgt aussieht:

@POST("apiName") 
Call<String> apiName(@Body OurClassName ourClassName); 

OurClassName-Klasse auf der Clientseite ist eine andere Klasse als die auf dem Dienst. Genau die gleiche Signatur, aber es ist lokal.

Wie kann ich diese @ Class Annotation in den ausgehenden JSON eingefügt bekommen?

+0

ich es durch das Erstellen eines benutzerdefinierten JSON-Objekt, das Einfügen der Anmerkung Arbeits bekam, dann ein Anfügen gson deserialized zur json Darstellung meines Gegenstandes und das jsonobject zum Service übergebend. Es funktioniert, aber es ist ein totaler Hack und sollte nicht sein, wie Retrofit verwendet wird, also werde ich keine Antwort dafür erstellen. Was ist der richtige Weg? – Nullqwerty

Antwort

0

Ok, habe es herausgefunden. Sie müssen Ihre Retrofit Builder hinzuzufügen:

.addConverterFactory(JacksonConverterFactory.create(
    new ObjectMapper().enableDefaultTyping(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT, JsonTypeInfo.As.PROPERTY) 
)) 

und dann oben auf der Klassendeklaration tun:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include= JsonTypeInfo.As.PROPERTY, property="@class")