2017-01-17 10 views
1

私はボレーとjsonを解析しようとしていましたが、何とかデータを抽出することができましたが、他のフィールドを解析できません。私は何をしようとしていますが、ユーザーの役割は、医師があるチェックし、ここに すべてのフィールドを取得するJson文字列を解析する

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

A1のArrayList

にのみ、そのユーザーを格納していることは私のコードです:

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

:とストア値(おそらく繰り返し)に進み、その後

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

を...とこれをすべてのフィールドを取得するための再帰的な方法にすることができますが、私はちょっと混乱しています。この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]

あなたは簡単にJSONオブジェクトのメソッドでアクセスすることができますJSONオブジェクトが埋め込まれている
+0

私はこれを試しましたが、リストが空でした。完全なクラスで投稿を更新する必要があります –

+0

@Addi - 入力Jsonは質問と同じですか?あなたの質問に答えるなら、それを確認し、Answeredとしてマークしてください。 –

+0

はいjsonはこの唯一のユーザーに似ていますが、その代わりに名前を持っています。私は幸運を祈っています。 –

1

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

:( 'ユーザリスト' を想定しあなたのルートJSONObjectです)。プロパティ「プレゼンス」はまた、埋め込みJSONObjectある

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

注などJSONObject.getJSONObjectでアクセスされなければならない。

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

これらのオブジェクトは、次いで、それらの特性は、を介してアクセスしていることができます() 方法。だから、

あなたはArrayListの中で、これらの値を保存したい場合は、単に作成:あなたは

userArrayList.add(user2);

+0

問題は静的なユーザーがいない、多くのユーザーとその名前がある可能性があります、どのようにjsonを取得するためにここを渡すためのユーザー名がわかりますかオブジェクト> JSONObject user2 = userList.getJSONObject( "user2"); –

関連する問題