Wysyłanie parametrów JSON z usługi java do sinatra

Mam aplikację na Androida do mojej usługi sinatra. Wcześniej nie byłem w stanie odczytać parametrów mojej usługi sinatra. Jednak po ustawieniu typu treści na „x-www-form-urlencoded”. Udało mi się zobaczyć params, ale nie do końca tak, jak chciałem. Dostaję coś takiego jak moje prośby w służbie mojej sinatry.

{"{\"user\":{\"gender\":\"female\"},\"session_id\":\"7a13fd20-9ad9-45c2-b308-
8f390b4747f8\"}"=> nil, "splat"=>["update_profile.json"], "captures"=>["update_profile.json"]}

W ten sposób składam wniosek z mojej aplikacji.

StringEntity se;                    
se = new StringEntity(getJsonObjectfromNameValueList(params.get_params(), "user");
se.setContentType("application/x-www-form-urlencoded");
postRequest.setEntity(se);



private JSONObject getJsonObjectfromNameValueList(ArrayList<NameValuePair> _params, String RootName) {
    JSONObject rootjsonObject = new JSONObject();
    JSONObject jsonObject = new JSONObject();

    if (_params != null) {
        if (!_params.isEmpty()) {
            for (NameValuePair p : _params) {
                try {
                    if (p.getName().equals(ApplicationFacade.SESSION_ID))
                        rootjsonObject.put((String) p.getName(), (String) p.getValue());
                    else
                        jsonObject.put((String) p.getName(), (String) p.getValue());
                } catch (JSONException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        }
    }

    try {
        rootjsonObject.put(RootName, jsonObject);

    } catch (JSONException e) {
        e.printStackTrace();
    }
    return rootjsonObject;
}

Próbowałem użyć metody podanej przez:Jak zrobić zagnieżdżony obiekt Json w Javie?

W ten sposób złożyłem wniosek za pomocą metody wymienionej w linku.

public ArrayList<NameValuePair> getJsonObjectfromNameValueList(ArrayList<NameValuePair> _params, String RootName){
    ArrayList<NameValuePair> arrayList = new ArrayList<NameValuePair>();
    JSONObject jsonObject = new JSONObject();
    if (_params != null) {
        if (!_params.isEmpty()) {
            for (NameValuePair p : _params) {
                try {
                    if (p.getName().equals(ApplicationFacade.SESSION_ID))
                        arrayList.add(new BasicNameValuePair((String) p.getName(), (String) p.getValue()));
                    else
                        jsonObject.put((String) p.getName(), (String) p.getValue());
                } catch (JSONException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        }
    }
    arrayList.add(new BasicNameValuePair(RootName, jsonObject.toString()));
    return arrayList;
}

Odpowiedź, którą otrzymałem po wprowadzeniu powyższej zmiany, brzmiała:

{"session_id"=>"958c7dee-f12c-49ec-ab0c-932e9a4ed173",
"user"=>"[gender=male]",
 "splat"=>["update_profile.json"],
 "captures"=>["update_profile.json"]}

Dość blisko, ale „płeć = mężczyzna” nie jest pożądana. Muszę ślepo przekazać te argumenty innej usłudze, więc muszę je naprawić.

Params, które chcę w mojej usłudze sinatra, są następujące.

{"session_id" : "958c7dee-f12c-49ec-ab0c-932e9a4ed173",
 "user": 
 {
   "gender" : "male"
 }

}

questionAnswers(2)

yourAnswerToTheQuestion