Library to convert JSON to urlencoded

后端 未结 2 829
忘了有多久
忘了有多久 2021-02-09 00:31

We are doing some integration towards a quite inconsistent (Zurmo-)REST API. The API only accepts urlencoded strings as its payload in the http posts, but it answers with JSON.

相关标签:
2条回答
  • 2021-02-09 01:16
    public static String objectToUrlEncodedString(Object object, Gson gson) {
        return jsonToUrlEncodedString((JsonObject) new JsonParser().parse(gson.toJson(object)));
    }
    
    private static String jsonToUrlEncodedString(JsonObject jsonObject) {
        return jsonToUrlEncodedString(jsonObject, "");
    }
    
    private static String jsonToUrlEncodedString(JsonObject jsonObject, String prefix) {
        String urlString = "";
        for (Map.Entry<String, JsonElement> item : jsonObject.entrySet()) {
            if (item.getValue() != null && item.getValue().isJsonObject()) {
                urlString += jsonToUrlEncodedString(
                        item.getValue().getAsJsonObject(),
                        prefix.isEmpty() ? item.getKey() : prefix + "[" + item.getKey() + "]"
                );
            } else {
                urlString += prefix.isEmpty() ?
                        item.getKey() + "=" + item.getValue().getAsString() + "&" :
                        prefix + "[" + item.getKey() + "]=" + item.getValue().getAsString() + "&";
            }
        }
        return urlString;
    }
    
    0 讨论(0)
  • 2021-02-09 01:35

    As noted below, it's not a Java library but you should be able to translate it :)

    Here's how you could do it in javascript:

    var jsonArrayToUrl = function (obj, prefix) {
      var urlString = "";
      for (var key in obj) {
        if (obj[key] !== null && typeof obj[key] == "object") {
          prefix += "[" + key + "]";
          urlString += jsonArrayToUrl(obj[key], prefix);
        }else{
          urlString += prefix + "[" + key + "]=" + obj[key] + "&";
        }
      }
      return encodeURIComponent(urlString);
    };
    

    Then call it with

    jsonArrayToUrl(test["data"], "data");
    

    By the example string you gave above it returns

    "data%5Bdescription%5D%3Dtest%26data%5BoccurredOnDateTime%5D%3D2013-10-24%2001%3A44%3A50%26"
    

    It should work recursively on nested arrays. You might also consider writing a wrapper for the function so that you only need one argument.

    0 讨论(0)
提交回复
热议问题