Как преобразовать тело HTTP-запроса в объект JSON в Java

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

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

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

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

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

спасибо

5 ответов


предполагая, что вы используете он полностью реализует интерфейс и библиотека JSON, как 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"], ...}
}

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


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

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

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


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