用于将JSON转换为urlencoded的库

我们正在对一个非常不一致的(Zurmo-)REST API进行一些集成。 API仅接受urlencoded字符串作为httppost中的有效负载,但它以JSON回答。 因为文档对此非常不清楚,我们自然认为我们可以将JSON发布到它,但事实并非如此。

所以现在我们所有的代码都生成JSON,当我们需要将它发送为x-www-form-urlencoded时,是否有任何java库可以从JSON转换为urlencoded字符串?

我们目前正在使用org.json lib,但如果需要它我们可以更改它。

例:

这个JSON字符串:

{"data":{"description":"test","occurredOnDateTime":"2013-10-24 01:44:50"}} 

应该转换成这个:

 data%5Bdescription%5D=test&data%5BoccurredOnDateTime%5D=2013-10-24+01%3A44%3A50 

Java代码:

我们将rasmushaglunds javascript代码翻译成java并将其包装起来,如果有其他人偶然发现这个问题,这就是结果。

 public static String jsonToURLEncoding(JSONObject json) { String output = ""; String[] keys = JSONObject.getNames(json); for (String currKey : keys) output += jsonToURLEncodingAux(json.get(currKey), currKey); return output.substring(0, output.length()-1); } private static String jsonToURLEncodingAux(Object json, String prefix) { String output = ""; if (json instanceof JSONObject) { JSONObject obj = (JSONObject)json; String[] keys = JSONObject.getNames(obj); for (String currKey : keys) { String subPrefix = prefix + "[" + currKey + "]"; output += jsonToURLEncodingAux(obj.get(currKey), subPrefix); } } else if (json instanceof JSONArray) { JSONArray jsonArr = (JSONArray) json; int arrLen = jsonArr.length(); for (int i = 0; i < arrLen; i++) { String subPrefix = prefix + "[" + i + "]"; Object child = jsonArr.get(i); output += jsonToURLEncodingAux(child, subPrefix); } } else { output = prefix + "=" + json.toString() + "&"; } return output; } 

如下所述,它不是Java库,但您应该能够翻译它:)

这是你如何在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); }; 

然后用它来调用它

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

通过上面给出的示例字符串返回

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

它应该在嵌套数组上递归工作。 您也可以考虑为函数编写一个包装器,这样您只需要一个参数。

 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 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; }