2014-10-28 2 views
0

У меня возникает проблема, связанная с внутренним контентом с моим приложением. Я пытаюсь создать запрос JSON, который передает имя пользователя и пароль на сервер. Сервер принимает эти значения и должен возвращать Пользователь, который я сопоставляю с пользовательским объектом.Проблема структурирования запроса JSON

В настоящий момент сервер настроен так, что он возвращает тот же самый JSON, который настроен для приема.

Я использую Jackson для выполнения всех сопоставлений JSON, есть ли способ изменить JSON, с которым я перехожу, чтобы соответствовать JSON ниже?

ВОТ JSON Посылаю

[ 
    { 
     "name":"username", 
     "value":"hi" 
    }, 
    { 
     "name":"password", 
     "value":"hi" 
    } 
] 

вот что JSON должен выглядеть, когда оно получено серверными

{ 
    "password":"hi", 
    "username":"hi" 
} 

ВОТ МОЯ USER ОТДЫХ

public static class AuthUser extends 
      AsyncTask<ArrayList<NameValuePair>, Void, User> { 

     public interface AuthUserDelegate { 

      public void getAuthenticatedUser(User user) throws JSONException; 
     } 

     AuthUserDelegate delegate; 
     Context mContext; 

     public AuthUser(Context context) { 

      mContext = context; 
      this.delegate = (AuthUserDelegate) context; 
     } 

     @Override 
     protected User doInBackground(ArrayList<NameValuePair>... params) { 
      ObjectMapper mapper = new ObjectMapper(); // create once, reuse 
      User user = null; 
      String url = ROUTE_USER_AUTH; 
      HttpPost httppost = new HttpPost(url); 
      HttpClient httpclient = new DefaultHttpClient(); 
      String UserJSONResponse = null; 

      try { 

       String jsonString = mapper.writeValueAsString(params[0]); 
       StringEntity m_stringEntity = new StringEntity(jsonString); 


//    UrlEncodedFormEntity m_entity = new UrlEncodedFormEntity(
//      params[0]); 
       httppost.setEntity(m_stringEntity); 
       httppost.addHeader("Content-type", "application/json"); 

       HttpResponse postResponse = httpclient.execute(httppost); 

       UserJSONResponse = EntityUtils.toString(postResponse 
         .getEntity()); 
       user = mapper.readValue(UserJSONResponse, User.class); 

       Log.e("E AUTH USER", "Status code: " 
         + postResponse.getStatusLine().getStatusCode()); 

       Log.e("E AUTH USER", "Auth was sent, Server returned: \n" 
         + UserJSONResponse); 

      } catch (JsonProcessingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (UnsupportedEncodingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       httppost.abort(); 
       Log.e("E IO EXCEPTION", "Error for URL: " + url, e); 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return user; 
     } 

     @Override 
     protected void onPostExecute(User result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      // User user = new User(); 
      // Log.e("AUTH POST USERNAME", result.getUser_name()); 
      try { 
       delegate.getAuthenticatedUser(result); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
    } 

ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ СОБИРАТЬ ИНФОРМАЦИЮ И ВЫПОЛНИТЬ AsyncTask

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
    case R.id.btnSignIn: 
     username = etUsername.getText().toString().trim(); 
     password = etPassword.getText().toString().trim(); 

     ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("username", username)); 
     nameValuePairs.add(new BasicNameValuePair("password", password)); 
     new UserREST.AuthUser(this).execute(nameValuePairs); 

     break; 

    default: 
     break; 
    } 

} 

ответ

2

Определите свой собственный JSONObject:

JSONObject input = new JSONObject(); 
input.put("username", "hi"); 
input.put("password", "hi"); 

И выполнить свою задачу так:

new UserREST.AuthUser(this).execute(input); 

Задача должна выглядят так:

public static class AuthUser extends AsyncTask<JSONObject, Void, User> 
{ 
    // [...] 

    @Override 
    protected User doInBackground(JSONObject... params) 
    { 
     User user = null; 
     String url = ROUTE_USER_AUTH; 
     HttpPost httppost = new HttpPost(url); 
     HttpClient httpclient = new DefaultHttpClient(); 
     String UserJSONResponse = null; 

     try 
     { 
      StringEntity m_stringEntity = new StringEntity(params[0].toString()); 
      // [...] 
+0

спасибо. Это решило мою проблему. –

0

Вместо использования функции NameValuePair использовать JSONObject.

public String getJSONAuth(String user, String pass) { 
    JSONObject jo = new JSONObject(); 
    jo.putString("username", user); 
    jo.putString("password", pass); 
    return jo.toString(); 
} 

Это возвращает то, что вы ищете.

Смежные вопросы