Java:是否可以创建一个带有“变量”字段的类?

时间:2014-10-14 09:55:39

标签: 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;
  }
}

你可以看到有些东西在这里不起作用:

如果responsefromapiJSONObject,我会尝试将其分配给response JSONArray显然不起作用...

我想做的是:

responsefromapi分配给responseresponseJSONObjectJSONArray,具体取决于responsefromapi。< / p>

这样我就可以使用sigle Class EventsResponse来处理这两种情况,EventsResponse将包含response JSONObjectJSONArray,具体取决于情况。

请那可能吗?

由于

3 个答案:

答案 0 :(得分:3)

尝试使用泛型:

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>(...);

答案 1 :(得分: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;
  ...
} 

答案 2 :(得分:0)

@LisaAnne。我的理解如下: -

  1. 你有两个场景,一个将返回JsonArray类型,另一个将返回JSONObject类型。
  2. 为了确保实现是干净的并且在同一个类中编写,您已经创建了两个重载的构造函数来从调用此EventsResponse类的类中获取响应类型。
  3. 然而问题似乎是将responseFromApi(JSONObject或JSONArray,取决于所使用的构造函数)赋值给JSONArray响应属性,因为不存在从Object到JSONArray的直接转换。
  4. 详细信息: -
    根据我的理解,我们使用JSONObject来存储和传递JSON字符串的值,如{name:"LisaAnne", address:"xyz", responseArray:[{name1:"n1"},{name1:"n2"}]}. JSONObject包含键值对,而 JSONArray包含一个有序对。如果将responseArray的值提取到JSONArray类型的对象中,您将获得成功。

    从响应中获取数组,以下类型的语句应该起作用。

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

    因此,无法从JSONObject直接转换为JSONArray。您将必须获取包含该数组的键并使用上面给出的语句来获取它。

    如果您能够在JSONObject responsefromapiJSONArray responsefromapi

    中收到回复结构,我将能够为您提供更好的解决方案

    希望这有帮助。