【问题标题】:creating complex JSON using BasicNameValuePair使用 BasicNameValuePair 创建复杂的 JSON
【发布时间】:2015-11-10 05:52:59
【问题描述】:

如何使用 ArrayList 创建此 JSON 以在 Android 中发布 json

{
"user" : 
    {
        "nickname" : "nickname6",
        "password" : "1234",
    }
}

我只得到一个平面 JSON

    ArrayList<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>();

    nameValuePairs.add(new BasicNameValuePair("nickname","nickname6"));
    nameValuePairs.add(new BasicNameValuePair("password", "1234"));

【问题讨论】:

  • 我只是想注意NameValuePair and BasicNameValuePair have been deprecated 我建议学习一些新东西
  • 如果你使用的是ArrayList,那么你能简单解释一下你的输出格式吗?

标签: java android basicnamevaluepair android-httptransport


【解决方案1】:

您需要创建一个 JSON,为此您必须将该 JSON 作为参数添加到您的 POST 方法中。要做到这一点,你可以试试这个:

JSONObject json = new JSONObject(jsonString);
JSONObject joParams = json.getJSONObject("params");
String nickname = joParams.getString("nickname");

    post.add(new BasicNameValuePair("nickname", nickname);

【讨论】:

  • 如果这个答案对你有帮助,请采纳这个答案,因为你已经看到了投票下方的勾号,让越来越多的人知道这个答案。
【解决方案2】:

如您所知,HttpClasses、NameValuePair 和 BasicNameValuePair 在最新的 android 中已被弃用。我们现在应该避免它。

如果你想创建

{
   "user":{
        "nickname":"nickname6"
        "password":"1234",             
    }
}

您可以使用下面的代码示例使用 JSONObject 类创建相同的 json。

JSONObject jObj = new JSONObject();

try {       
    JSONObject userCredentials = new JSONObject();
    userCredentials.put("nickname","nickname6");
    userCredentials.put("password","1234");

    jObj.put("user", userCredentials);
} catch(Exception e) {
   e.printStackTrace();
}

【讨论】:

  • HttpClasses、NameValuePair 和 BasicNameValuePair 的替代方案是什么?你有一个简单的帖子操作的好例子吗?谢谢。
  • 使用 HttpURLConnection,这是 HttpClasses 的好(最好的)替代方案。
  • @user1684140 :如果您觉得这很有帮助,请不要忘记接受这个答案。或者如果您需要有关 api 调用或 Json 解析的任何进一步帮助,请添加/发表您的评论
【解决方案3】:

尝试像这样使用 ContentValues

ContentValues values=new ContentValues();
values.put("username",name);
values.put("password",password);

或 使用 MultipartEntity

MultipartEntity multi = new MultipartEntity();
multi.addPart("name", new StringBody("your data"));
multi.addPart("Id", new StringBody("123"));

【讨论】:

    【解决方案4】:

    这是一个使用 AsyncTask 的 http post 示例:

    public class httpSendrequest extends AsyncTask<Void,Void,String> {
    
            ArrayList<NameValuePair> nvPairs=new ArrayList<>();
    
        Boolean error=false;
    
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
    
                //here you initialize your json object and add it to value pairs
                JSONObject jObj = new JSONObject();
    
        try {       
                JSONObject userCredentials = new JSONObject();
                userCredentials.put("nickname","nickname6");
                userCredentials.put("password","1234");
    
                jObj.put("user", userCredentials);
        nvPairs.add(new BasicNameValuePair("jsonstring",jObj.toString()));
        } catch(Exception e) {
          error=true;
        }
    
            }
    
            @Override
            protected String doInBackground(Void... params) {
    
        if(!error)
                try{
    
                    String link ="http://"+ip+"/QSystem.asmx/insert_answer" ;
                    HttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost(link); //adding URL to the http post
                    httppost.setEntity(new UrlEncodedFormEntity(nvPairs, HTTP.UTF_8)); //adding the value pairs and encoding to the http post request
                    HttpResponse response = httpclient.execute(httppost);
                    HttpEntity resEntity = response.getEntity();
    
    
                } catch (Exception e){
                    error=true;
                }
    
                return "str";
            }
    
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
    
                if(!error) {
                    Toast.makeText(getApplicationContext(), "Sent", Toast.LENGTH_SHORT).show();
    
                }
            }
    
        }
    

    然后您可以从 onCreate 或在按钮的 OnClickListener 中调用它,如下所示:

    new httpSendrequest().execute();
    

    希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多