【问题标题】:Handling web services with null objects response处理具有空对象响应的 Web 服务
【发布时间】:2018-09-04 04:30:09
【问题描述】:

在所有服务的 Web 服务响应中处理空对象以在应用程序中用“不可用”替换它们的最佳方法是什么。

例如。对于以下响应,我的目标是能够用“不可用”之类的字符串替换所有空字符串对象:

"data": { "restaurant_id": 1, 
          "restaurant_name": "m&ms", 
          "logo": "", 
          "rate": null, 
          "price": 55, 
          "is_open": false, 
          "address": null, 
          "image": ""
        }

【问题讨论】:

标签: java android json web-services


【解决方案1】:

解析中接近null的两种方式,具体取决于解析方式。

1) 如果您使用 POJO 类进行解析,那么最好的解决方案是在 getter 方法中检索值检查。 例如: 你转换后的 POJO 是这样的

public class Data {

@SerializedName("restaurant_id")
@Expose
private Integer restaurantId;
@SerializedName("restaurant_name")
@Expose
private String restaurantName;
@SerializedName("logo")
@Expose
private String logo;
@SerializedName("rate")
@Expose
private String rate;
@SerializedName("price")
@Expose
private Integer price;
@SerializedName("is_open")
@Expose
private Boolean isOpen;
@SerializedName("address")
@Expose
private String address;
@SerializedName("image")
@Expose
private String image;

public Integer getRestaurantId() {
return restaurantId;
}

public void setRestaurantId(Integer restaurantId) {
this.restaurantId = restaurantId;
}

public String getRestaurantName() {
return restaurantName;
}

public void setRestaurantName(String restaurantName) {
this.restaurantName = restaurantName;
}

public String getLogo() {
return logo;
}

public void setLogo(String logo) {
this.logo = logo;
}

public String getRate() {
return getValue(rate);
}

public void setRate(String rate) {
this.rate = rate;
}

public Integer getPrice() {
return price;
}

public void setPrice(Integer price) {
this.price = price;
}

public Boolean getIsOpen() {
return isOpen;
}

public void setIsOpen(Boolean isOpen) {
this.isOpen = isOpen;
}

public String getAddress() {
return getValue(address);
}

public void setAddress(String address) {
this.address = address;
}

public String getImage() {
return image;
}

public void setImage(String image) {
this.image = image;
}

}

现在您可以实现自己的自定义方法来检查字符串值是否为空?如果它为空,则设置您要传递的默认值。 例如,我检查了地址并对其进行评分

喜欢这个

//It will return "Not Available" if value is null you can set your default value
public static String getValue(String value){
    return TextUtils.isEmpty(value)? "Not Available" : value  
}
//You can override it like this too.
public static String getValue(String value, String defaultValue){
    return TextUtils.isEmpty(value)? defaultValue : value  
}

2) 如果你不使用直接解析和手动解析 JSON 那么

String jsonString = "Paste server response in json";

        try {
            JSONObject jsonObject = new JSONObject(jsonString);

            JSONObject dataJson = jsonObject.getJSONObject("data");
            String address = dataJson.optString("address","Not Available");

        } catch (JSONException e) {
            e.printStackTrace();
        }

【讨论】:

    【解决方案2】:

    试试这个,你可以检查你的 Getter 和 setter 方法中的值是 null 还是空

    示例代码

    public class POJO {
        @SerializedName("rate")
        @Expose
        String rate;
    
        @SerializedName("restaurant_name")
        @Expose
        String restaurant_name;
    
        @SerializedName("image")
        @Expose
        String image;
    
        @SerializedName("address")
        @Expose
        String address;
    
        public String getRate() {
            if (TextUtils.isEmpty(rate)) {
                return "not available";
            }
            return rate;
        }
    
        public void setRate(String rate) {
            this.rate = rate;
        }
    
        public String getAddress() {
            if (TextUtils.isEmpty(address)) {
                return "not available";
            }
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
    
        public String getRestaurant_name() {
            if (TextUtils.isEmpty(restaurant_name)) {
                return "not available";
            }
    
            return restaurant_name;
        }
    
        public void setRestaurant_name(String restaurant_name) {
            this.restaurant_name = restaurant_name;
        }
    
        public String getImage() {
            if (TextUtils.isEmpty(image)) {
                return "not available";
            }
    
            return image;
        }
    
        public void setImage(String image) {
            this.image = image;
        }
    }
    

    =============================================

    如果你想手动通过,不如试试这个

    if(jsonObject.has("rate"))
    {
      if (jsonObject.isNull("rate"))
         {
           String rate = "not available";
         }else{
            String rate =jsonObject.getString("rate");;
         }
    }
    

    【讨论】:

    • 我需要将其推广到整个应用程序。
    • AFAIK 没有针对整个应用程序的通用方法,您必须手动检查或修改您的 getter setter 或更好地让您从后端获得更改响应 @AhmedEsameddeen
    【解决方案3】:

    如果您使用的是像 Jackson 这样的工具,除非在您的模型类上指定了 @JsonIgnoreProperties(ignoreUnknown = true)(或在对象映射器的配置中),否则默认情况下它会在未知属性上失败。

    无论如何,我只是说 Jackson 是当今 java 中序列化/反序列化 json 的一种常用方法,默认情况下它会在未知道具上抛出 400 Bad Request - 也许这是你需要的?

    【讨论】:

      【解决方案4】:

      您可以使用JSONObject 对其进行解析,然后只需检查 null 并更新它:

      String jsonString = "..."; // Your JSON String
      
      // Parse the JSON string into a JSONObject
      JSONObject obj = new JSONObject(jsonString);
      
      // Grab all the keys
      Iterator<String> iter = obj.keys();
      
      // Check each key
      while (iter.hasNext()) {
        String key = iter.next();
        Object value = obj.get(key);
      
        // IF a key is null set it to "Not available"
        if (value == null) {
          obj.put(key, "Not available");
        }
      }
      

      然后您只需使用 JSONObject 来填充您的 UI。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多