如何在Java中将HTTP请求体转换为JSON对象

13

我正在寻找一个Java库/ API,可以将HTTP请求POST主体的内容转换成JSON对象。

理想情况下,我想使用一个Apache Sling库(因为它们在我的容器中自然暴露)。

我找到的最接近的是:org.apache.sling.commons.json.http,它将标头转换为JSON。

HTTP POST主体的格式为:key1=value1&key2=value2&..&keyn=valueN,因此我认为一定有相应的解决方案,但我还没有找到。

如果不存在现成的解决方案,我可能需要使用自定义的JSONTokenerorg.apache.sling.commons.json.JSONTokener)来完成这项任务。您有什么想法吗?

谢谢

6个回答

13

假设您正在使用HttpServlet和一个像json-simple这样的JSON库,您可以按照以下方式进行操作:

public JSONObject requestParamsToJSON(ServletRequest req) {
  JSONObject jsonObj = new JSONObject();
  Map<String,String[]> params = req.getParameterMap();
  for (Map.Entry<String,String[]> entry : params.entrySet()) {
    String v[] = entry.getValue();
    Object o = (v.length == 1) ? v[0] : v;
    jsonObj.put(entry.getKey(), o);
  }
  return jsonObj;
}

使用示例:

public void doPost(HttpServletRequest req, HttpServletResponse res) {
  JSONObject jsonObj = requestParamsToJSON(req);
  // Now "jsonObj" is populated with the request parameters.
  // e.g. {"key1":"value1", "key2":["value2a", "value2b"], ...}
}

3
原文:turns out you can do: JSONObject json = new JSONObject(slingHttpServletRequest.getParameterMap()); as well - your method does give a bit more control over what is allowed into the json object (such as introducing a white/black list) - which is nice.翻译:原来你也可以这样做:JSONObject json = new JSONObject(slingHttpServletRequest.getParameterMap());。不过,你的方法在允许哪些内容进入JSON对象方面提供了更多的控制(例如引入白名单/黑名单),这很不错。 - empire29
嗨,我已经从您提供的链接下载了JSON库。现在我该如何使用它呢?能否请您说明一下? - Pavan Kumar
@empire29:非常感谢更多关于此的深入见解。 - Pavan Kumar

1

我建议尝试使用Apache Commons Beanutils

ServeltRequest request;

Map map = request.getParameterMap();
MyObject object = new MyObject();
BeanUtils.populate(object, map);
String json = object.toJSON() //using any JSON library

1

2
将URL参数转换为JSON是没有帮助的。 - bmargulies

1

1

导入org.json.JSONObject包;

 JSONObject json = new JSONObject(request.getParameterMap())

每个值都是一个数组。 - mauretto

-1
使用Gson。通过它,您可以创建具有私有变量的类,这些变量表示您想要的数据,例如:。
meta:{
       name:"Example"
       firstname:"Example2"
     }
data:[
      {
        title:"ecaetra"
        description:"qwerty"
      }
      ...
     ]

可以像这样检索Json对象:

public class RetrieveData {

      private Meta meta;
      private List<Data> data;

      public Meta getMeta(){
            return meta;
      }

      public List<Data> getData(){
            return data;
      }
}

public class Meta {

      private String name;
      private String firstname;

      public String getName(){
            return name;
      }

      public String getFirstName(){
            return firstname;
      }

}

public class Data {

      private String title;
      private String description;

      public String getTitle(){
            return title;
      }

      public String getDescription(){
            return description;
      }

}

你的指示很简单。Content是你页面的内容,你可以使用Asynctask来检索它。

 Object o = new Gson().fromJson(Content, RetrieveData.class);
 data = (RetrieveData)o;
 // Get Meta
    data.getName(); // Example
    data.getFirstName(); // Example2
 // Get Data
    data.get(0).getTitle(); // position 0 : ecaetra
    data.get(0).getDescription(); // position 0 : qwerty

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