Multiple converters with Retrofit 2

后端 未结 4 1024
萌比男神i
萌比男神i 2020-12-13 10:30

I have a HATEOAS (HAL) REST service and managed to talk to it with the code below (using halarious as a conversion engine) but when I try to merge the converters (stal

4条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-13 11:06

    package ch.halarious.core;
    
    import com.google.gson.JsonArray;
    import com.google.gson.JsonDeserializationContext;
    import com.google.gson.JsonElement;
    import com.google.gson.JsonObject;
    import com.google.gson.JsonParseException;
    import java.lang.reflect.Type;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * Custom Hal Deserializer  
     *
     * @author jaren
     */
    public class CustomHalDeserializer extends HalDeserializer {
    
        /**
         * Intialisiert ein HalDeserializer-Objekt
         *
         * @param targetType Typ, den wir eigentlich deserialisieren sollten
         */
        public CustomHalDeserializer(Class targetType) {
            super(targetType);
        }
    
        class CustomArrayList extends ArrayList implements HalResource{}
    
        public HalResource deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context, Class targetType) throws JsonParseException {
            // Es handelt sich um ein JSON-Objekt.
            JsonObject jsonObject = json.getAsJsonObject();
            JsonObject embeddedRoot = jsonObject.getAsJsonObject(HalConstants.EMBEDDED_ROOT);
    
            if(embeddedRoot != null){
                Set> set = embeddedRoot.entrySet();
                if(set.toArray().length == 1){
                    JsonArray ja = embeddedRoot.getAsJsonArray(set.iterator().next().getKey());
                    if(ja.isJsonArray()) {
                        CustomArrayList arrayResult = new CustomArrayList();
                        Iterator i = ja.iterator();
                        while(i.hasNext()){
                            JsonElement je = i.next();
                            arrayResult.add(super.deserialize(je, typeOfT, context, targetType));
                        }
                        return arrayResult;
                    }
                }
            }
    
            return super.deserialize(json, typeOfT, context, targetType);
        }
    }
    

提交回复
热议问题