【问题标题】:encode json object params in httpurlconnection在 httpurlconnection 中编码 json 对象参数
【发布时间】:2019-11-15 19:47:38
【问题描述】:

我想在android中使用httpurlconnection向服务器发布一些参数,我的数据是一个嵌套的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);

【问题讨论】:

  • 我认为第二个 jsonobject 编码错误
  • 请记录你的错误,我认为你必须递归编码你的对象
  • 我的服务器端错误处理,他们说你发布的信息是错误的,如何递归编码我的对象?
  • 好的,你能把你的编码结果放在上面的例子中吗?
  • 我发送测试 url 的数据,在 php 代码中说只是打印发布的所有内容,在 android 中我收到:{"par":"{\"class\":\"a\ ",\"family\":\"aray\"}","email" : "manjeet@gmail.com","name" : "Manjeet"}

标签: java json httpurlconnection encode


【解决方案1】:

我不确定这段代码,因为我从未使用过 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();
}

【讨论】:

    【解决方案2】:

    从输出构造一个URI,只编码字符?#/ 这比你的循环容易得多

    您可以使用 URI,它会产生不同的输出和结果 以下示例

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

    产生结果http://host.com/path/?key=%7C%20?/%23ä#fragment。请注意,诸如 ?&/ 之类的字符如何未被编码以允许 URI 查询字符串 (从 API 复制)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      相关资源
      最近更新 更多