Java 无法从jsonObject获取字符串

Java 无法从jsonObject获取字符串,java,android,json,Java,Android,Json,我有这个JSON字符串 { "drtest": { "password":"dr123", "presence": { "lastSeen":1485992132269, "status":"offline" }, "role":"Doctor", "speciality":"Physiotherapist", "token":"f80v

我有这个JSON字符串

{
    "drtest": {
        "password":"dr123",
        "presence": {
            "lastSeen":1485992132269,
            "status":"offline"
         },
         "role":"Doctor",
         "speciality":"Physiotherapist",
         "token":"f80ve0sY6Ak:APA91bGLPlmy7b_iyqtW9ioG11TOx3xTB9BJgb1vvBK4YRo-28DyXWydg476TvjzaxyNB3kTTMn0BycEDm9UJHAPeoWzV-vFrwN46hg-GKSI6DH1s9zrH8h834c2whEdr12XqWN-4jrs"
     },
    "patient": {
         "password":"pat123",
         "presence": {
             "lastSeen":1486046501150,
             "status":"online"
         },
         "role":"Patient",
         "token":"f80ve0sY6Ak:APA91bGLPlmy7b_iyqtW9ioG11TOx3xTB9BJgb1vvBK4YRo-28DyXWydg476TvjzaxyNB3kTTMn0BycEDm9UJHAPeoWzV-vFrwN46hg-GKSI6DH1s9zrH8h834c2whEdr12XqWN-4jrs"
    }
}
首先我要跟踪医生的角色,但现在我也要跟踪专业。然而,我正在尝试的代码应该是正确的工作,但它不是预期的工作

正如您所看到的,只有一个实体具有专业数据,而另一个实体不包含专业字段。如果JSON中没有专业字段,我如何解析专业数据并忽略它

我正在使用以下代码:

    try {
        contactList.clear();
        JSONObject obj = new JSONObject(s);
        Iterator i = obj.keys();
        String key = "";

        while (i.hasNext()) {
            key = i.next().toString();
            JSONObject singleUser = (JSONObject) obj.get(key);
            String role = singleUser.get("role").toString();

            JSONObject singleUser2 = (JSONObject) obj.get(key);

            String tpesu= singleUser2.getString("speciality");

            // no success here? need help want this value...
            Log.e("specialittyyyyyyy",tpesu+"");

            JSONObject presence = singleUser.getJSONObject("presence");
            String status = presence.getString("status");

            if (!key.equals(UserDetails.username)) {
                if (role.equals("Doctor")) {
                    HashMap<String, String> docs = new HashMap<>();
                    docs.put("name", key);
                    docs.put("status", status);
                    Log.e("status ", status + "");
                    contactList.add(docs);
                }
            }
            totalUsers++;
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
试试看{
contactList.clear();
JSONObject obj=新的JSONObject;
迭代器i=obj.keys();
字符串键=”;
while(i.hasNext()){
key=i.next().toString();
JSONObject singleUser=(JSONObject)obj.get(key);
字符串role=singleUser.get(“role”).toString();
JSONObject singleUser2=(JSONObject)obj.get(key);
字符串tpesu=singleUser2.getString(“专业”);
//这里没有成功?需要帮助想要这个值。。。
Log.e(“speciallityyyyyyy”,tpesu+”);
JSONObject presence=singleUser.getJSONObject(“presence”);
字符串状态=presence.getString(“状态”);
如果(!key.equals(UserDetails.username)){
if(角色平等(“医生”)){
HashMap docs=新建HashMap();
文件。put(“名称”,键);
单据放置(“状态”,状态);
Log.e(“状态”,状态+”);
联系人列表。添加(文档);
}
}
totalUsers++;
}
}捕获(JSONException e){
e、 printStackTrace();
}

将singleUser这样括起来,以避免格式或空指针异常

if(singleUser2.has("speciality")) {
    tpesu = singleUser2.getString("speciality");
}

全局声明字符串tpesu。

将singleUser括起来,以避免格式或空指针异常

if(singleUser2.has("speciality")) {
    tpesu = singleUser2.getString("speciality");
}

全局声明字符串tpesu。

您可以使用“has”函数。i、 e.如果(singleUser2.has(“speciality”)…

您可以使用“has”功能。i、 e.如果(singleUser2.has(“speciality”)…

您的
singleUser
singleUser2
json对象是相同的(drtest),因为您是通过引用相同的
键来检索它们的。相反,让下一个可用键检索
singleUser2
singleUser2key=…
在下面的示例中)


您的
singleUser
&
singleUser2
json对象是相同的(drtest),因为您是通过引用相同的
值来检索它们的。相反,让下一个可用键检索
singleUser2
singleUser2key=…
在下面的示例中)


发生的jsonexception的logcat是什么