2017-01-17 2 views
1

Я пытаюсь разобрать json с volley, так или иначе мне удалось извлечь некоторые данные, но я не могу разобрать другие поля. То, что я пытаюсь сделать, это проверить, какую роль пользователя врач и хранить только то, что пользователь a1 Список_массивовParsing Json string, извлекающий все поля

{"user1":{"password":"******","presence":{"lastSeen":1484695229773,"status":"online"},"role":"Patient"},"user2":{"password":"******","presence":{"lastSeen":1484695229773,"status":"offline"},"role":"Doctor"}} 

вот мой код:

public class Users extends AppCompatActivity { 
    ListView usersList; 
    TextView noUsersText; 
    ArrayList<String> al = new ArrayList<>(); 
    int totalUsers = 0; 
    ProgressDialog pd; 
    private Firebase mRef; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.act_users); 

     usersList = (ListView)findViewById(R.id.usersList); 
     noUsersText = (TextView)findViewById(R.id.noUsersText); 


     pd = new ProgressDialog(Users.this); 
     pd.setMessage("Loading..."); 
     pd.show(); 

     String url = "https://**********.firebaseio.com/users.json"; 

     StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>(){ 
      @Override 
      public void onResponse(String s) { 
       doOnSuccess(s); 
      } 
     },new Response.ErrorListener(){ 
      @Override 
      public void onErrorResponse(VolleyError volleyError) { 
       System.out.println("" + volleyError); 
      } 
     }); 

     RequestQueue rQueue = Volley.newRequestQueue(Users.this); 
     rQueue.add(request); 

     usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       UserDetails.chatWith = al.get(position); 
       startActivity(new Intent(Users.this, Chat.class)); 
      } 
     }); 






    }//oncreate ends here 




    public void doOnSuccess(String s){ 
     try { 
      JSONObject obj = new JSONObject(s); 

      Iterator i = obj.keys(); 
      String key = ""; 

      while(i.hasNext()){ 
       key = i.next().toString(); 

       if(!key.equals(UserDetails.username)) { 
        al.add(key); /// here want to store only user with doctor role 
//currently all users are displaying 
       } 

       totalUsers++; 
      } 

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

     if(totalUsers <=1){ 
      noUsersText.setVisibility(View.VISIBLE); 
      usersList.setVisibility(View.GONE); 
     } 
     else{ 
      noUsersText.setVisibility(View.GONE); 
      usersList.setVisibility(View.VISIBLE); 
      usersList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, al)); 
     } 

     pd.dismiss(); 
    } 
} 

я успешно получаю Корневой объект «user1» и «user2», но я хочу извлечь все остальные поля, а также

любезно сообщите, как мне нужно изменить свой код для всех полей.

EDITED 

public void doOnSuccess(String s){ 
     try { 
      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(); 

       if(!key.equals(UserDetails.username)) { 
        if (role.equals("Doctor")) { 
         // doctors.add(keys); 
         al.add(key); 
        } 

       } 

       totalUsers++; 
      } 

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

     if(totalUsers <=1){ 
      noUsersText.setVisibility(View.VISIBLE); 
      usersList.setVisibility(View.GONE); 
     } 
     else{ 
      noUsersText.setVisibility(View.GONE); 
      usersList.setVisibility(View.VISIBLE); 
      usersList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, al)); 
     } 

     pd.dismiss(); 
    } 
} 
+0

Вы может сделать это рекурсивным методом для получения всех полей, но я немного смущен, что это за массив a1, который у вас есть? Является ли это набором атрибутов пользователя? – applecrusher

+0

a1 является arraylist для хранения имен пользователей, тогда я назначаю эти имена для списка адаптера –

+0

может предоставить любой пример рекурсивного метода для получения всех полей –

ответ

0

Это должно дать всем пользователям с врачом роли.

 JSONParser parser = new JSONParser(); 

     Object obj = parser.parse(new FileReader(
       "sample.json")); 

     JSONObject jsonObject = (JSONObject) obj; 

     Set<String> keySet = jsonObject.keySet(); 
     List<String> doctors = new ArrayList<>(); 

     for (String keys : keySet) { 
      JSONObject singleUser = (JSONObject) jsonObject.get(keys); 
      String role = singleUser.get("role").toString(); 
      if (role.equals("Doctor")) { 
       doctors.add(keys); 
      } 
     } 
     System.out.println("Doctor users are --" + doctors); 

Выход -

Доктор пользователи - [user2]

+0

. Я попробовал это, но список был пуст. Я должен обновить сообщение с полным классом. –

+0

@Addi. Является ли вход Json таким же, как в вопросе ???, он дает мне желаемый результат для него. Пожалуйста, проверьте и отметьте как ответ, если он ответит на ваш запрос. –

+0

да json похож на этого только у пользователя, вместо этого его имена. Я пытаюсь пожелать мне удачи. –

1

Вы получаете значения из объекта пользователя следующим

JSONObject user = obj.getJSONObject("user1"); 
String role = user.getString("role"); 
JSONObject presence = user.getJSONObject("presence"); 
String status = presence.getString("status"); 
0

Вы внедренные объекты JSON, которые могут быть легко доступны с помощью метода объекта JSON: (предполагается, что '' USERLIST ваш корневой JSONObject);

JSONObject user2 = userList.getJSONObject("user2"); 

Эти объекты могут тогда их свойства доступны:

String user2Password = user2.getString("password");

Примечание свойство «присутствие» также встроенный JSONObject, и так должен будет получить доступ с JSONObject.getJSONObject().

Так что если вы хотите сохранить эти значения в ArrayList, просто создать:

ArrayList<JSONObject> userArrayList = new ArrayList<JSONObject>(); 

..., а затем перейти к хранения значений (возможно итерационно) с:

userArrayList.add(user2);

+0

проблема заключается в том, что у меня нет статических пользователей, может быть много пользователей и с их именем, как я узнаю, что такое имя пользователя для передачи здесь, чтобы получить json Объект> JSONObject user2 = userList.getJSONObject ("user2"); –