2014-10-14 2 views
2

Спасибо за помощь.Java: возможно ли создать класс с «переменными» полями?

У меня следующая ситуация:

У меня есть класс, который содержит ответ от API:

public class EventsResponse extends ApiResponse { 

    public JSONArray response; 

    public EventsResponse(Boolean success,RequestHandle requesthandle, JSONArray responsefromapi) { 
    super(success, requesthandle); 
    if(responsefromapi!=null)this.response=responsefromapi; 
    else response=null; 
    } 
    public EventsResponse(Boolean success,RequestHandle requesthandle, JSONObject responsefromapi) { 
    super(success, requesthandle); 
    if(responsefromapi!=null)this.response=responsefromapi; 
    else response=null; 
    } 
} 

Как вы можете увидеть что-то не работает здесь:

если responsefromapi является a JSONObject Я пытаюсь присвоить его response, который является JSONArray, очевидно, не работает ...

Что я хотел бы сделать, это:

назначить что responsefromapi для response и имеют response быть JSONObject или JSONArray в зависимости от того, что responsefromapi.

Так что я могу использовать класс EventsResponse аббревиатура для обработки как ситуации и EventsResponse будет содержать response который JSONObject или JSONArray в зависимости от ситуации.

Возможно ли это?

Благодаря

+0

Все возможно, но что бы вы тогда планировали сделать с объектом, который не знает точного типа? – biziclop

+0

@biziclop Я могу проверить, какой объект я могу получить назад и действовать соответственно, то есть идея ... –

+0

Имеет ли ваш responsefromapi JSONObject ключ, значение которого является массивом, и вы хотите, чтобы этот массив был сохранен в ответ JSONArray .? – Amal

ответ

3

Попробуйте использовать Generics:

public class EventsResponse<K> extends ApiResponse { 
    public K response; 
    public EventsResponse(Boolean success, RequestHandle requesthandle, K responsefromapi) { 
     super(success, requesthandle); 
     response = responsefromapi; 
    } 
} 

Вы можете назвать это так:

new EventResponse<JSONObject>(...); 

И

new EventResponse<JSONArray>(...); 
+0

Вы совершенно правы, Питер, я отредактировал вопрос, спасибо –

+0

@LisaAnne Я думаю, что он имел в виду 'else response = null;' часть, которая является излишней. Ответ уже «null». Все еще ваше редактирование правильно :) – Narmer

2

не очень элегантно, но вы можете попробовать использовать Object общий суперкласс ссылаться ваш ответ:

public Object response; 
... 
... 
public EventsResponse(Boolean success,RequestHandle requesthandle, JSONArray responsefromapi) { 
    super(success, requesthandle); 
    if(response!=null)this.response= (Object)responsefromapi; 
    else response=null; 
} 

Вам потребуется отражение в Java, чтобы использовать объект ссылки в коде:

if(response.getClass().equals(JSONArray.class)) { 
    ... 
    ... 
    JSONArray responseAsJSONArray = (JSONArray)response; 
    ... 
} 
0

@LisaAnne. Мое понимание дано ниже: -

  1. У вас есть два сценария, из которых один вернет тип JsonArray, а другой вернет тип JSONObject.
  2. Чтобы убедиться, что реализация чиста и написана в том же классе, вы создали два перегруженных конструктора для получения типа ответа из класса, который вызывает этот класс EventResponse.
  3. Проблема, как представляется, заключается в назначении responseFromApi (JSONObject или JSONArray в зависимости от используемого конструктора) к свойству отклика JSONArray, поскольку прямой отбор из объекта в JSONArray отсутствует.

Подробности: -
Согласно моему пониманию, мы используем JSONObject хранить и передавать значение чего-то JSON Струнный как {name:"LisaAnne", address:"xyz", responseArray:[{name1:"n1"},{name1:"n2"}]}. JSONObject содержит ключевые пары значений В то время, JSONArray содержит упорядоченную пару. Если вы получите значение responseArray в тип объекта JSONArray, вы добьетесь успеха.

Чтобы получить массив из ответа, должен работать следующий тип инструкции.

JSONArray response= bigDataResponse.getJSONArray("responseArray"); 

Таким образом, прямой бросок от JSONObject к JSONArray не будет возможно. Вам нужно будет получить ключ, содержащий массив, и использовать приведенное выше утверждение для его получения.

я буду в состоянии дать вам лучшее решение, если вы можете дать мне структуры ответа, полученные в JSONObject responsefromapi и JSONArray responsefromapi

Надеется, что это помогает.

Смежные вопросы