Frage Jackson und generische Typenreferenz


Ich möchte jackson json Bibliothek für eine generische Methode wie folgt verwenden:

public MyRequest<T> tester(){
  TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>();  
  MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef);
  return requestWrapper.getRequest();
}
public class MyWrapper<T> {

    private MyRequest<T> request;

    public MyRequest<T> getRequest() {
        return request;
    }

    public void setRequest(MyRequest<T> request) {
        this.request = request;
    }
}


 public class MyRequest{
     private List<T> myobjects;

     public void setMyObjects(List<T> ets) {
         this.myobjects = ets;
     }

     @NotNull
     @JsonIgnore
     public T getMyObject() {
         return myobjects.get(0);
     }
}

Jetzt das Problem ist, dass, wenn ich getMyObject () rufe, die innerhalb des Anforderungsobjekts jackson ist, das verschachtelte kundenspezifische Objekt als LinkedHashMap zurückbringt. Gibt es eine Möglichkeit, in der ich festlege, dass das T-Objekt zurückgegeben werden muss ?. Beispiel: Wenn ich ein Objekt vom Typ Kunde gesendet habe, sollte der Kunde von dieser Liste zurückgegeben werden.

Vielen Dank.


75
2017-07-27 14:39


Ursprung


Antworten:


Dies ist ein bekanntes Problem beim Löschen von Java-Typen: T ist nur eine Typvariable, und Sie müssen die tatsächliche Klasse angeben, normalerweise als Klassenargument. Ohne solche Informationen ist es am besten, Grenzen zu verwenden; und einfaches T ist ungefähr dasselbe wie 'T erweitert Objekt'. Und Jackson wird dann JSON-Objekte als Maps binden.

In diesem Fall muss die Tester-Methode Zugriff auf die Klasse haben und Sie können sie konstruieren

JavaType type = mapper.getTypeFactory().
  constructCollectionType(List.class, Foo.class)

und dann

List<Foo> list = mapper.readValue(new File("input.json"), type);

138
2017-07-27 22:51



'JavaType' funktioniert !! Ich habe versucht, eine Liste in JSON-String zu ArrayList-Java-Objekten zu entpacken (deserialisieren) und hatte seit Tagen Mühe, eine Lösung zu finden.
Unten ist der Code, der mir schließlich eine Lösung gab. Code:

JsonMarshallerUnmarshaller<T> {
    T targetClass;

    public ArrayList<T> unmarshal(String jsonString) {
        ObjectMapper mapper = new ObjectMapper();

        AnnotationIntrospector introspector = new JacksonAnnotationIntrospector();
        mapper.getDeserializationConfig()
            .withAnnotationIntrospector(introspector);

        mapper.getSerializationConfig()
            .withAnnotationIntrospector(introspector);
        JavaType type = mapper.getTypeFactory().
            constructCollectionType(
                ArrayList.class, 
                targetclass.getClass());

        try {
            Class c1 = this.targetclass.getClass();
            Class c2 = this.targetclass1.getClass();
            ArrayList<T> temp = (ArrayList<T>) 
                mapper.readValue(jsonString,  type);
            return temp ;
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null ;
    }  
}

6
2018-03-05 17:07