Json Pojo Unmarshaler с классами полиморф для Android - PullRequest
0 голосов
/ 26 октября 2010

У меня проблема с отдыхом и android, проблема в том, что у меня есть транспортный объект, например, класс Human, который расширен для Male и Female, я хочу использовать json в качестве транспорта для человеческого объекта.если бы я использовал стандартные сериализованные объекты, я обычно делал бы

if(human instanceof Male.class){}
else if(human instance of Female.class){}
else{ throw new RuntimeException("incorrect class")}

, как я могу реализовать это в Android с отдыхом?Я видел, что Gson и Jaskson, которые не поддерживают полиморфизм, на стороне сервера мы используем Apache CXF для отдыха с аннотациями jax-rs Идеи / предыдущий опыт ??

1 Ответ

0 голосов
/ 26 октября 2010

Я не знаю ни одного автоматического способа выполнения десериализации, но одним из решений является использование парсера " duck typing " для вашего JSON.

Предположим следующее

class Human {
    public Human(JSONObject jo) {
        // Parse out common json elements
    }
}

class Male {
    private boolean hasMaleParts;
    public Male(JSONObject jo) {
        super(jo);
        // Parse out male only parts
    }
}

class Female {
    private boolean hasFemaleParts;
    public Female(JSONObject jo) {
        super(jo);
        // Parse out female only parts
    }
}

С этими тремя классами, где-то в вашем коде доступа к сети, есть метод, который печатает ваш возвращенный JSON и возвращает соответствующий объект.

public Human typeJson(JSONObject jo) {
    if(jo.hasBoolean(hasMaleParts))
        return new Male(jo);
    else if(jo.hasBoolean(hasFemaleParts))
        return new Female(jo);
    else
        throw new RuntimeException("Unable to determine data type");
}

В этом примере hasMaleParts и hasFemaleParts - произвольные логические флаги, однако во многих случаях вы можете (более правильно) набрать его, используя идентифицирующие атрибуты. Итак, если вы пытаетесь различить Motorcycle и Car, вы можете проверить number_of_wheels.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...