如何在Java中将JSON数据作为请求参数发送到URL

3
我想以以下格式在URL中发送JSON数据。
editTest.jsp?details=374889331-{"aNumber":2}

我该如何做到这一点?
6个回答

4

将您的详细信息参数进行URL编码:

String otherParameter = "374889331-";    
String jsonString = "{\"aNumber\":2}";

String url = "editTest.jsp?details=" + URLEncoder.encode(otherParameter + jsonString, "UTF-8");

这句话有意义吗?它将其编码为看起来相当奇怪的URL参数:%7B%22aNumber%22%3A2%7D - Alex Moore-Niemi
@AlexMoore-Niemi 请查看此URL编码参考:https://www.w3schools.com/tags/ref_urlencode.ASP - eee
编码本身没问题,但是它也编码了括号等字符。这似乎并不完全等同于发送“foo=bar”,我认为并不是所有的服务器都会将其解释为相同的内容。不过我猜这就是帖子作者所要求的! - Alex Moore-Niemi
这不应该被接受为答案。{"test":true,"name":"foo"} 需要转换为 test=true&name=foo - undefined

2

您需要将JSON对象转换为字符串。

      JSONObject obj = new JSONObject();

      obj.put("name","foo");

      StringWriter out = new StringWriter();
      obj.writeJSONString(out);

      String jsonText = out.toString();//JSON object is converted to string

现在,您可以将这个jsonText作为参数传递。

问题在于转换后的字符串包含了“:”,这在URL中无法使用。 - Sanjaya Liyanage
@SanjayaLiyanage,你在问题中从未提到过这一点...! - Nishad K Ahamed
@SanjayaLiyanage 是的,我知道,但这不是你的问题,对吧? - Nishad K Ahamed
好的Nishad,如果问题没有说清楚我很抱歉。我无法从URL发送JSON数据是因为它包含:。 - Sanjaya Liyanage
好的,听起来不错。为什么不使用请求对象来传递参数呢?你使用哪个框架? - Nishad K Ahamed
Nishad,当我编码URL并发送时,那个东西就可以正常工作。谢谢你的帮助 :) - Sanjaya Liyanage

1
我们可以使用GSON将对象转换为JSON对象,然后解析JSON对象并将其转换为查询参数字符串。该对象应仅包含原始对象,如int、float、string、enum等。否则,您需要添加额外的逻辑来处理这些情况。
public String getQueryParamsFromObject(String baseUrl, Object obj) {
        JsonElement json = new Gson().toJsonTree(obj);
        // Assumption is that all the parameters will be json primitives and there will
        // be no complex objects.
        return baseUrl + json.getAsJsonObject().entrySet().stream()
                .map(entry -> entry.getKey() + "=" + entry.getValue().getAsString())
                .reduce((e1, e2) -> e1 + "&" + e2)
                .map(res -> "?" + res).orElse("");
    }

0
我们可以借助 Gson 的帮助。
String result =new Gson().toJson("your data");

注意:需要Gson的jar文件。

这个并没有对数据进行URL编码。 - msp

0

Json2 可以帮助你。 JSON.stringify(obj)


0
我想要添加我的解决方案:
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonElement;


private static String createURIString(String str) {
    try {
        URI uri = new URI(str);
        return uri.toASCIIString();
    } catch (URISyntaxException x) {
        throw new IllegalArgumentException(x.getMessage(), x);
    }
}

private static String convertJSONBodyToURL(String input){
    // input = "{ \"name\": \"Test\", \"java\": true}";

    ArrayList<String> arr = new ArrayList<String>();
    
    JsonObject jsonObject = new JsonParser().parse(input).getAsJsonObject();
    for (Entry<String, JsonElement> entry : jsonObject.entrySet()) {
        String key = entry.getKey();
        String value = entry.getValue().toString();
            // remove "', new URI would fail
            value = value.replace("\"", "").replace("'", "");
        
        // value sanity checks
        String valueURI = FixAPI.createURIString(value);
        
        // fail in case of problems
        if(valueURI == null){
            // err
            return null;
        }

        // if safe, add to array            
        arr.add(key + "=" + value);
    }
    
    // join array to String
    String joinedURLString = String.join("&", arr);
    
    return joinedURLString;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接