Android Advoid很多人在解析json时尝试捕获blog
我尝试从Facebook sdk获取数据: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
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(“数据”)
。