【问题标题】:How to handle null values in Volley StringRequest如何处理 Volley StringRequest 中的空值
【发布时间】:2015-09-27 01:29:19
【问题描述】:

我有一个返回 2 组不同值的响应。在每种情况下,一个值将始终为空,而另一个值将始终包含一个值。问题是 Volley 不允许我分配空 JSON 值或在 if 语句中检查 JSON 值。它只是指 catch 块。我正在尝试做类似的事情:

StringRequest request = new StringRequest(Request.Method.POST, "url", new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            try {
                JSONObject obj = new JSONObject(response);
                //If this is null, it stops here and goes to catch.
                String value1 = obj.getString("value1") 
                String value2 = obj.getString("value2");

                //Can't perform any more code because Value1 is null

            } catch (JSONException e) {
                Log.d("Log","Your String was null");

            }

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("Log", "Unable to connect to server!");
        }
    });

由于库的设计方式,我无法使用 throws,它迫使我将其放入 try/catch 中。无论如何,这周围有吗?

编辑:以下异常是我得到的:

org.json.JSONException: value1 没有值

【问题讨论】:

  • 为什么不直接测试response的值?
  • response 不是空的部分。问题在于将我的任何get 值(在本例中为getString)放入变量中仍会导致catch 块执行。因此,禁止我将其放入 if/else 中。
  • 我很想听听什么值得反对。很简单的问题。
  • 好的,所以您是说response 不为空,但是有一个异常导致以下日志"Your String was null",但是您不会查看实际的异常来确定这一点出去?
  • 您的异常是No value for value1,这意味着它发生在get("value1") 行。 get 的文档说 Returns the value mapped by name, or throws if no such mapping exists. 很好。现在,如果您花时间进一步了解,您会发现has 方法,即Returns true if this object has a mapping for name.。所以,你绝对可以测试if (obj.has("value1")) { ... }。确实不难。

标签: android json android-volley


【解决方案1】:

您是否尝试过在 JSONObject 上使用 .isNull("key") 方法?

然后你可以这样做:

String value1 = jsonObject.isNull("value1") ? null : jsonObject.getString("value1");    
String value2 = jsonObject.isNull("value2") ? null : jsonObject.getString("value2");

【讨论】:

  • 在实际获得价值之前必须进行检查真是太疯狂了。为什么它不能像您期望的那样返回 null 。这样您就不必对任何可能为空的字段进行这些检查
【解决方案2】:

我刚刚找到了一个更短的解决方案。 optGet() 函数。

String value1 = jsonObject.optString("value1");    
String value2 = jsonObject.optString("value2");

它返回 null 而不是抛出错误。它们存在于每种类型中,包括optJSONArray()optJSONObject()

Link to Documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2017-09-12
    • 2016-05-04
    相关资源
    最近更新 更多