spy*_*don 8 java rest json urlencode
我们正在对一个非常不一致的(Zurmo-)REST API进行一些集成.API仅接受urlencoded字符串作为http帖子中的有效负载,但它以JSON回答.因为文档对此非常不清楚,我们自然认为我们可以发布JSON,但事实并非如此.
所以现在我们所有的代码都生成JSON,当我们需要将它发送为x-www-form-urlencoded时,是否有任何java库可以从JSON转换为urlencoded字符串?
我们目前正在使用org.json lib,但如果需要它我们可以更改它.
例:
这个JSON字符串:
{"data":{"description":"test","occurredOnDateTime":"2013-10-24 01:44:50"}}
Run Code Online (Sandbox Code Playgroud)
应该转换成这个:
data%5Bdescription%5D=test&data%5BoccurredOnDateTime%5D=2013-10-24+01%3A44%3A50
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
小智 8
现在有一个更简单的方法,那就是使用URLEncoder.encode方法。
导入URLEncoder包:
import java.net.URLEncoder;
Run Code Online (Sandbox Code Playgroud)
进而:
URLEncoder.encode(objectMapper.writeValueAsString(<yourClass>), StandardCharsets.UTF_8.toString());
Run Code Online (Sandbox Code Playgroud)
您可以在这里测试您的结果:
https://onlinejsontools.com/url-decode-json
小智 5
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5625 次 |
| 最近记录: |