开发者社区 问答 正文

使用Serilizable注释检查响应项目的空白值

我正在使用MVVVMPattern进行API调用。一切正常,期望使用数据类在对数据进行序列化时从服务器获得一些空白值。 我有伺服器回应

"items": [
  {
    "id": "1",
    "inspiration_id": "11",
    "name": "xxx",
    "categoryoptions": [
      "x",
      "y",
      "z"
    ]
  },
  {
    "id": "2",
    "inspiration_id": "22",
    "name": "test",
    "categoryoptions": [

    ]
  }

为此,我使用了序列化和改造。

public class InspirationItemsData implements Serializable {

@Expose
@SerializedName("id")
private String id;
@Expose
@SerializedName("inspiration_id")
private String inspiration_id;
@Expose
@SerializedName("name")
private String name;
@Expose
@SerializedName("coordinates")
private String coordinates;
@Expose
@SerializedName("is_request")
private String is_request;

@Expose
@SerializedName("categoryoptions")
List<CategoryOptions> categoryOptionsList = new ArrayList<>();

public InspirationItemsData(String id, String inspiration_id, String name, String coordinates,String is_request) {
    this.id = id;
    this.inspiration_id = inspiration_id;
    this.name = name;
    this.coordinates = coordinates;
    this.is_request = is_request;
}

public List<CategoryOptions> getCategoryOptionsList() {
    return categoryOptionsList;
}

public void setCategoryOptionsList(List<CategoryOptions> categoryOptionsList) {
   this.categoryOptionsList = categoryOptionsList;
}

public String getIs_request() {
    return is_request;
}

public void setIs_request(String is_request) {
    this.is_request = is_request;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getInspiration_id() {
    return inspiration_id;
}

public void setInspiration_id(String inspiration_id) {
    this.inspiration_id = inspiration_id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getCoordinates() {
    return coordinates;
}

public void setCoordinates(String coordinates) {
    this.coordinates = coordinates;
}

您可以在我的数据类中看到我有具有备用值的categoryoptions数组。在某些项目中,它具有价值,而有些则没有。

所以当我使用这个

@Expose @SerializedName(“ categoryoptions”)列表categoryOptionsList = new ArrayList <>(); 然后我无法得到回应。onChanged()方法既不要求观察者调用,也不响应。

但是,如果我在上面的行中发表评论,我就能获得响应并能够显示到UI。因此对于null使用@Expose检查和空白值即时通讯,但它不起作用。

这是API调用

void getInspirationDetails() {
    inspirationDetailsModel.getInspirationDetails().observe(InspirationUploadDetailsActivity.this, new Observer<MainInspirationDetailsResponse>() {
        @Override
        public void onChanged(MainInspirationDetailsResponse mainInspirationDetailsResponse) {

            if (mainInspirationDetailsResponse != null) {
                if (mainInspirationDetailsResponse.getStatus().equalsIgnoreCase("0")) {
                    InspirationDetailData inspirationDetailData = mainInspirationDetailsResponse.getInspirationDetailData();
                    if (inspirationDetailData != null) {

                        Util.displayImage(InspirationUploadDetailsActivity.this, inspirationDetailData.getImage_file(), imgUploadedInsipration);

                        List<InspirationItemsData> inspirationItemsData = inspirationDetailData.getInspirationItemsData();
                        if (inspirationItemsData != null && inspirationItemsData.size() > 0) {

                            categoriesAdapter = new CategoriesAdapter(InspirationUploadDetailsActivity.this, inspirationItemsData);
                            rvCategories.setAdapter(categoriesAdapter);

                        }

                    }
                }
            }

        }
    });
}

高级帮助将不胜感激!

展开
收起
Puppet 2019-11-28 18:30:30 626 分享 版权
阿里云 AI 助理回答

从你的描述来看,问题似乎出在数据类中categoryOptionsList字段的初始化与序列化处理上。你提到当直接在数据类中初始化categoryOptionsList为一个新的ArrayList时,观察者不会被调用,而注释掉这行代码后却能正常工作。这可能是因为Gson(或其他JSON解析库)在反序列化空数组时遇到了已初始化的非null列表对象,导致它没有正确地替换或填充这个字段。

为了解决这个问题,你可以尝试以下几种方法:

  1. 不直接在数据类中初始化列表:移除构造函数中的初始化,并且不在字段声明时初始化categoryOptionsList。让Gson自动为它创建一个新的ArrayList(如果JSON中有值的话),或者保持为null(如果JSON中是空数组)。
@Expose
@SerializedName("categoryoptions")
private List<String> categoryOptionsList; // 移除初始化

// 构造函数中也无需初始化
public InspirationItemsData(String id, String inspiration_id, String name, String coordinates, String is_request) {
    this.id = id;
    this.inspiration_id = inspiration_id;
    this.name = name;
    this.coordinates = coordinates;
    this.is_request = is_request;
}
  1. 使用默认值初始化:如果你希望即使JSON中没有提供值,也能确保得到一个非null的列表,可以考虑在数据类中使用Collections.emptyList()作为默认值,但请注意,这样初始化的列表是不可变的,你需要在设置时替换整个列表。
@Expose
@SerializedName("categoryoptions")
private List<String> categoryOptionsList = Collections.emptyList();
  1. 自定义序列化/反序列化逻辑:如果你使用的序列化库支持(如Gson的TypeAdapter或Jackson的JsonDeserializer),你可以编写自定义逻辑来处理特定情况下的空数组或null值。

  2. 检查并处理空响应:在观察者的onChanged方法中,增加对inspirationItemsData和每个元素的categoryOptionsList是否为空的检查,以确保UI能够妥善处理这些情况。

确保你的API调用和观察者逻辑能够优雅地处理null或空数组的情况,这对于维护应用的健壮性是非常重要的。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
API
问答地址: