Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Advoid很多人在解析json时尝试捕获blog_Android_Json_Exception - Fatal编程技术网

Android Advoid很多人在解析json时尝试捕获blog

Android Advoid很多人在解析json时尝试捕获blog,android,json,exception,Android,Json,Exception,我尝试从Facebook sdk获取数据: public void onCompleted(JSONObject object, GraphResponse response) { String name = null; try { name = object.getString("name"); } catch (JSONException e) { e.printStackTrace(); } String profil

我尝试从Facebook sdk获取数据:

public void onCompleted(JSONObject object, GraphResponse response) {
    String name = null;
    try {
        name = object.getString("name");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    String profile = null;
    try {
        profile = object.getJSONObject("picture").getJSONObject("data").getString("url");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    String cover = null;
    try {
        cover = object.getJSONObject("cover").getString("source");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    String email = null;
    try {
        email = object.getString("email");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    String gender = null;
    try {
        gender = object.getString("gender");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    String birthday = null;
    try {
        birthday = object.getString("birthday");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    new SessionManager(activity).storeUserInfo(name, profile, cover, email, gender, birthday);
}
这是非常不利的,因为有很多字段,每个字段都可以为空,每个字段都需要一个try-cach博客


我需要一个解决方案,使代码更清晰。

我更愿意这样做:

String value = object.has(key) && !object.isNull(key) ? object.getString(key) : null;

一行、更干净、更容易~:)

所有字段都是必填字段吗?
您可以这样做:

try{
   name = object.getString("name");
   ... // more methods here
   new SessionManager(activity).storeUserInfo(name, profile, cover, email, gender, birthday);
}catch(JSONException e){
  e.printStackTrace( );
}  
这样,只有在检索完所有字段后,才能访问会话管理器。即使缺少一个字段,也会直接转到
catch

其他:

public String getString(JSONObject obj,String key,String defVal){
    if( obj.has(key) )
        return obj.getString( key );
    return defVal; 
}  
现在您可以执行以下操作:


name=getString(json,“名称”,“未定义”)

如果您只想删除try-catch块,请使用“opt”替换“get” (例如,
optInt(键)
optString(键)


请注意,如果密钥不存在,“opt”将返回null,这可能会导致许多空指针异常而不进行检查。

好的,您可以通过调用
对象来检查密钥是否存在。has(“key”)
如下所示:

public void onCompleted(JSONObject object, GraphResponse response) {
    String name = "", profile = "", cover = "", email = "", gender = "", birthday = "";
    try {
        if (object.has("name")){
            name = object.getString("name");
        }
        if (object.has("picture")){
            profile = object.getJSONObject("picture").getJSONObject("data").getString("url");
        }
        if (object.has("cover")){
            cover = object.getJSONObject("cover").getString("source");
        }
        if (object.has("email")){
            email = object.getString("email");
        }
        if (object.has("gender")){
            gender = object.getString("gender");
        }
        if (object.has("birthday")){
            birthday = object.getString("birthday");
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
    new SessionManager(activity).storeUserInfo(name, profile, cover, email, gender, birthday);
}

如果任何一种语法出现异常而不是进入catch…,请在一个try块中添加所有语法

public void onCompleted(JSONObject object, GraphResponse response) { String name = null; try { name = object.getString("name"); String profile = null; profile = object.getJSONObject("picture").getJSONObject("data").getString("url"); String cover = null; cover = object.getJSONObject("cover").getString("source"); String email = null; email = object.getString("email"); String gender = null; gender = object.getString("gender"); String birthday = null; birthday = object.getString("birthday"); } catch (JSONException e) { e.printStackTrace(); } new SessionManager(activity).storeUserInfo(name, profile, cover, email, gender, birthday); }

每个字段都可以为空???捕获发生在
object.getString(“key”)返回null,对吗???如果没有“键”,它将抛出一个异常,以便我需要捕获它来传递其他字段否,它抛出一个异常您不能使用Gson或Jackson吗?这已经是一个已解决的问题了。@mdtuyen好的,检查我的回答。如果使用这种格式的代码多于..,我宁愿“编写一个方法”。。一次。是的,你可以!它使它更干净。OP在许多情况下已经有空值(无论是否有意),因此使用optXYZ是避免get的最直接方法,但在单个键上有例外。我认为最好使用gson。如果缺少关键字“email”,我们将无法获得性别和生日。(代码缩进4个空格,除非想要创建标题,否则不要使用带“---”的行。您可以返回并添加换行。)如果缺少关键字“email”,我们将无法获取性别和生日。object.getString(“名称”)表示抛出NPE,您将永远无法达到其余的值。对吗?它更清晰,但仍然很长。我将把它视为一个选项。<(“name”)< /代码>是检查<代码> name <代码>是否存在,如果不是,<代码> name=Objult.GETSHIPE(“name”);< /代码>永远不会调用,所以NPE如何发生@ JyyHyeAh,但是如果 GETJSONObjt怎么办?“data”)
抛出空值,您必须检查too@meda是的,但是在这种情况下,函数
onCompleted
已经有
对象
是一个
JSONObject
,我们不再需要
.getJSONObject(“数据”)