【问题标题】:Parsing Json string retrieving all fields解析Json字符串检索所有字段
【发布时间】:2017-01-18 19:29:10
【问题描述】:

我一直在尝试用 volley 解析 json,不知何故我设法提取了一些数据,但我无法解析其他字段。我正在尝试做的是检查哪个用户角色是医生并仅将该用户存储到 a1 arraylist

{"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();
    }
}

【问题讨论】:

  • 你可以用递归的方法来获取所有的字段,但是我有点困惑,你有这个a1数组是什么?这是一个用户属性数组吗?
  • a1 是用于存储用户名的数组列表,然后我将这些名称分配给列表适配器
  • 你能提供任何递归方法的例子来获取所有字段
  • 我只想将角色为医生的用户存储在 a1 数组列表中?
  • 检查我的答案,看看是否有帮助

标签: java android json


【解决方案1】:

您从用户对象中获取值如下

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

【讨论】:

    【解决方案2】:

    这应该为所有用户提供医生角色。

            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]

    【讨论】:

    • 我试过了,但列表是空的,我应该用完整的课程更新帖子
    • @Addi - 输入 Json 与问题中的相同吗???,它为我提供了所需的输出。如果它回答了您的问题,请验证并标记为已回答。
    • 是的 json 类似于这个唯一的用户有他们的名字。我正在努力祝我好运。
    • 我正在尝试在 android 中执行此操作,但无法解析 keyset()
    • ypu 使用的是哪个 json 库?.. 我正在使用 google-json 库
    【解决方案3】:

    您已嵌入 JSON 对象,可以通过 JSON 对象方法轻松访问:(假设“userList”是您的根 JSONObject);

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

    然后可以通过以下方式访问这些对象的属性:

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

    请注意,“presence”属性也是一个嵌入式 JSONObject,因此必须使用 JSONObject.getJSONObject() 方法进行访问。

    因此,如果您想将这些值存储在 ArrayList 中,只需创建:

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

    ...然后继续存储值(可能是迭代地):

    userArrayList.add(user2);

    【讨论】:

    • 问题是我没有静态用户,可以有很多用户和他们的名字,我怎么知道用户名是什么来传递这里获取json对象>JSONObject user2 = userList.getJSONObject("user2");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多