Как преобразовать HTTP-тело запроса в JSON-объект в Java - PullRequest
10 голосов
/ 17 августа 2011

Я пытаюсь найти Java lib / api, который позволит мне превратить содержимое тела POST HTTP-запроса в объект JSON.

В идеале я хотел бы использовать библиотеку Apache Sling (поскольку они естественным образом отображаются в моем контейнере).

Самое близкое, что я нашел: org.apache.sling.commons.json.http, который преобразует заголовок в JSON.

HTTP Почтовые тела в формате; key1=value1&key2=value2&..&keyn=valueN поэтому я предполагаю, что там что-то есть, но я не смог его найти.

Возможно, мне просто нужно использовать пользовательский JSONTokener (org.apache.sling.commons.json.JSONTokener), чтобы сделать это, если что-то еще не существует. Мысли

Спасибо

Ответы [ 6 ]

11 голосов
/ 17 августа 2011

Если вы используете HttpServlet и библиотеку JSON, например json-simple , вы можете сделать что-то вроде этого:

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"], ...}
}
1 голос
/ 17 августа 2011

Извините, что сделал это своим собственным ответом, но, очевидно, моя репутация не позволяет мне просто добавить комментарий к ответу Как преобразовать тело HTTP-запроса в JSON-объект в Java из maerics.

Я бы также перебрал параметры запроса, но вместо использования произвольной библиотеки json используйте JSONObject, предоставляемый sling.http://sling.apache.org/apidocs/sling6/org/apache/sling/commons/json/JSONObject.html

1 голос
/ 17 августа 2011

Я рекомендую попробовать 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 голос
/ 17 августа 2011

Джексон также является хорошим вариантом - он широко используется весной. Вот учебник: http://wiki.fasterxml.com/JacksonInFiveMinutes

0 голосов
/ 29 ноября 2018

import org.json.JSONObject;

 JSONObject json = new JSONObject(request.getParameterMap())
0 голосов
/ 17 августа 2011

Используйте 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;
      }

}

И ваша инструкция проста. Содержимое - это содержимое вашей страницы, вы можете получить его с помощью 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
...