【问题标题】:Library to convert JSON to urlencoded将 JSON 转换为 urlencoded 的库
【发布时间】:2013-10-24 04:41:31
【问题描述】:

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

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

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

示例:

这个 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 json rest urlencode


    【解决方案1】:
    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;
    }
    

    【讨论】:

    • 我想知道是否有更简单的方法可以做到这一点,因为两年多过去了......顺便说一句,这个功能很棒!我只是希望它占映射对象中的最后一个值并剥离与号
    • 我不认为它可以处理 Json 数组,但可以吗?
    【解决方案2】:

    如下所述,它不是 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"
    

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

    【讨论】:

      【解决方案3】:

      现在有一个更简单的方法,那就是使用URLEncoder.encode 方法。

      导入URLEncoder 包:

      import java.net.URLEncoder; 
      

      然后:

      URLEncoder.encode(objectMapper.writeValueAsString(<yourClass>), StandardCharsets.UTF_8.toString());
      

      你可以在这里测试你的结果:

      https://onlinejsontools.com/url-decode-json

      【讨论】:

      • 我猜这8年已经发生了一些变化,我会把你的答案标记为正确的。 :)
      猜你喜欢
      • 2018-06-11
      • 2015-08-16
      • 2020-10-06
      • 2019-12-04
      • 2020-08-21
      • 2020-04-06
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      相关资源
      最近更新 更多