Pertanyaan Jackson dan referensi tipe generik


Saya ingin menggunakan pustaka jackson json untuk metode umum sebagai berikut:

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

Sekarang masalahnya adalah ketika saya memanggil getMyObject () yang ada di dalam objek permintaan, jackson mengembalikan objek kustom bersarang sebagai LinkedHashMap. Apakah ada cara di mana saya menentukan bahwa objek T harus dikembalikan ?. Sebagai contoh: jika saya mengirim objek bertipe Pelanggan maka Pelanggan harus dikembalikan dari Daftar itu ?.

Terima kasih.


75
2017-07-27 14:39


asal


Jawaban:


Ini adalah masalah yang terkenal dengan penghapusan jenis Java: T hanya tipe variabel, dan Anda harus menunjukkan kelas yang sebenarnya, biasanya sebagai argumen Kelas. Tanpa informasi semacam itu, yang terbaik yang bisa dilakukan adalah menggunakan batasan; dan T polos hampir sama dengan 'T extends Object'. Dan Jackson akan mengikat JSON Objects sebagai Maps.

Dalam hal ini, metode penguji perlu memiliki akses ke Kelas, dan Anda dapat membangun

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

lalu

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

138
2017-07-27 22:51



'JavaType' berfungsi !! Saya mencoba untuk unmarshall (deserialize) Daftar di json String ke ArrayList Objek java dan berjuang untuk menemukan solusi sejak hari.
Di bawah ini adalah kode yang akhirnya memberi saya solusi. Kode:

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