кодировать параметры объекта json в httpurlconnection - PullRequest
1 голос
/ 05 июля 2019

Я хочу опубликовать некоторые параметры на сервере с httpurlconnection в Android, мои данные - это вложенный JsonObject, и я должен сначала закодировать его, но это неправильно, потому что я получаю сообщение об ошибке состояния от сервера, это моя функция кодирования и Jsonobject:

    private static String encodeParams(JSONObject params) throws Exception   {
    StringBuilder result = new StringBuilder();
    boolean first = true;
    Iterator<String> itr = params.keys();
    while(itr.hasNext()){
        String key= itr.next();
        Object value = params.get(key);
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(key, "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(value.toString(), "UTF-8"));
      }
    return result.toString();
    }

мой вложенный JSON:

JSONObject postDataParams = new JSONObject();
postDataParams.put("name", "Manjeet");
postDataParams.put("email", "manjeet@gmail.com");

JSONObject par = new JSONObject();
par.put("class", "a");
par.put("family", "aray");

postDataParams.put("par", par);

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Я не уверен насчет этого кода, так как я никогда не работал с JSONObject, но я попытаюсь показать вам идею :

Создайте метод, который возвращает все свойства объекта (включая вложенный):

Map<String, String> jobjectToMap(JSONObject jo) {
   Map<String, String> properties = new HashMap<String, String>;
   Iterator<String> itr = jo.keys();
   while(itr.hasNext()){
        String key= itr.next();
        Object value = jo.optJSONObject(key);//this will returns null if the value is not a JSONObject from https://docs.oracle.com/middleware/maf242/mobile/api-ref/oracle/adfmf/json/JSONObject.html#getJSONObject-java.lang.String-
        if(value != null) { //nested object
           properties.putAll(jobjectToMap(value));
        } else {
           properties.put(key, jo.get(key)); //primitive one
        }
   }

   return properties; 
}

Создайте другой метод, который преобразует карту в URL

public String queryParams(Map<String, String> params)
        throws UnsupportedEncodingException
{
    StringBuilder queryString = new StringBuilder();
    if (params.size() > 0) {
     queryString.append('&');
    }

    // Convert the params map into a query string.
    for (Map.Entry<String, String> entry : params.entrySet())
    {
        String encodedKey = URLEncoder.encode(entry.getKey(), "UTF-8");
        String encodedValue = URLEncoder.encode(entry.getValue(), "UTF-8");

        queryString.append(encodedKey);
        queryString.append('=');
        queryString.append(encodedValue);
    }

    return queryString.toString();
}
1 голос
/ 05 июля 2019

Построить URI из вывода, только кодируя символы ?#/ что намного проще, чем ваш цикл

Вы можете использовать URI, которые производят другой результат и результат Следующий образец

new URI("http", "host.com", "/path/", "key=| ?/#ä", "fragment").toURL();

дает результат http://host.com/path/?key=%7C%20?/%23ä#fragment. Обратите внимание, что такие символы, как? & / Не кодируются, чтобы разрешить строку запроса URI (Скопировано из API)

...