【问题标题】:How to add values to JSONObject on button click in android?如何在android中单击按钮时向JSONObject添加值?
【发布时间】:2021-01-20 04:24:56
【问题描述】:

我有一个适配器,我正在创建edittext供用户动态输入数据。

现在,我必须将其存储在 JSONObject 中的键值对中吗? 我该怎么做?

我将所有创建的编辑文本存储在一个列表中

ArrayList<EditText> list = new ArrayList<>();

编辑部分

我正在将edittext添加到这样的列表中:

list.add(holder.editText);

编辑部分-结束

这是我的按钮点击监听代码:

addnewAcnt.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Toast.makeText(context, "INIT", Toast.LENGTH_SHORT).show();
                JSONObject jsonObject2 = null;
                for (int i = 0; i < count; i++)
                {
                    jsonObject2 = new JSONObject();
                    try
                    {
                        jsonObject2.put(String.valueOf(list.get(i).getHint()), String.valueOf(list.get(i).getText()));
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                        Log.e("JsonToSendError: ", String.valueOf(e));
                    }

                    Log.e("JsonToSend: ", String.valueOf(jsonObject2));
                }
            }
        });

我在 Log 中获取数据为:

2020-10-05 15:19:21.476 16462-16462/com.packagename E/JsonToSend:: {"Title":"StackOverFlow"}
2020-10-05 15:19:21.476 16462-16462/com.packagename E/JsonToSend:: {"URL":"www.stackoverflow.com"}
2020-10-05 15:19:21.476 16462-16462/com.packagename E/JsonToSend:: {"Username":"test"}
2020-10-05 15:19:21.476 16462-16462/com.packagename E/JsonToSend:: {"Password":"testtesttest"}

但是,我需要它位于单个对象中,例如:

{"Title":"StackOverFlow", "URL":"www.stackoverflow.com", "Username":"test", "Password":"testtesttest"}

任何帮助都会很有用。 请

【问题讨论】:

  • 因为您在循环中创建新对象,请尝试在循环之前移动您的 jsonObject2 = new JSONObject();
  • 非常感谢,解决了所有问题,现在我无法获得最后一个对象的值 {"Title":"StackOverFlow", "URL":"www.stackoverflow.com", "Username":"test", "Password":""}

标签: android json android-studio android-json


【解决方案1】:

我认为您需要在回调 onclick 之外定义 jsonObject2 = new JSONObject();。希望这对您有所帮助。

【讨论】:

  • 非常感谢,解决了所有问题,但现在我无法获得最后一个对象的值 {"Title":"StackOverFlow", "URL":"www.stackoverflow.com", "Username":"test", "Password":""}
  • 在forloop外调用Log.e("JsonToSend: ", String.valueOf(jsonObject2));
【解决方案2】:

在 for 循环之前创建 JSON 对象 并在 for 循环中初始化。这是错误的

在 FOR 循环之前初始化一个 JSON 对象

将此行 jsonObject2 = null; 更改为 jsonObject2 = new JSONObject(); 并从 FOR 循环中删除

addnewAcnt.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Toast.makeText(context, "INIT", Toast.LENGTH_SHORT).show();


                jsonObject2 = new JSONObject();


                for (int i = 0; i < count; i++)
                {
                    //jsonObject2 = new JSONObject();
                    try
                    {
                        jsonObject2.put(String.valueOf(list.get(i).getHint()), String.valueOf(list.get(i).getText()));
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                        Log.e("JsonToSendError: ", String.valueOf(e));
                    }

                    Log.e("JsonToSend: ", String.valueOf(jsonObject2));
                }
            }
        });

【讨论】:

  • 非常感谢,解决了所有问题,但现在我无法获得最后一个对象的值 {"Title":"StackOverFlow", "URL":"www.stackoverflow.com", "Username":"test", "Password":""}
【解决方案3】:

因为您在循环中创建新对象,请尝试在循环之前移动您的 jsonObject2 = new JSONObject();

关于最后一个对象,我不确定变量count 的值是如何改变的。但是,如果您从列表中获取价值,则应该在循环中使用该列表计数。

代码应该是这样的。

addnewAcnt.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Toast.makeText(context, "INIT", Toast.LENGTH_SHORT).show();
                JSONObject jsonObject2 = new JSONObject();
                for (int i = 0; i < list.size(); i++) // variable count to be your list (edit text) size.
                {
                    try
                    {
                        jsonObject2.put(String.valueOf(list.get(i).getHint()), list.get(i).getText().toString().trim());
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                        Log.e("JsonToSendError: ", String.valueOf(e));
                    }

                    Log.e("JsonToSend: ", String.valueOf(jsonObject2));
                }
            }
        });

【讨论】:

  • 我试过了,还是一样!我已经尝试过使用 dataModelArrayList(来自模型和适配器)仍然一样! :(
  • @Test 我编辑了我的答案,尝试使用.getText().toString()
  • 还是同一个兄弟,我注意到一件事,如果我按下提交按钮(键盘)它会迭代到下一个编辑文本,但在密码字段之前,它不会迭代到下一个密码字段的编辑文本!
  • 奇怪,json 对象键已经从密码字段的提示中获取,但没有检索到值。介意分享完整代码吗?
  • 没问题,你要我分享哪一部分?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 2019-11-20
  • 2022-09-30
  • 1970-01-01
相关资源
最近更新 更多