2011-08-16 50 views
5

我試圖找到一個Java lib/api,它允許我將HTTP請求POST正文的內容轉換爲JSON對象。如何將HTTP請求正文轉換爲Java中的JSON對象

理想情況下,我想使用一個Apache Sling庫(因爲它們在我的容器中自然暴露)。

我發現它最近:org.apache.sling.commons.json.http它將頭轉換爲JSON。

HTTP Post body是格式; key1=value1&key2=value2&..&keyn=valueN所以我認爲那裏有東西,但我還沒有找到它。

我可能只需要使用自定義JSONTokenerorg.apache.sling.commons.json.JSONTokener)來做到這一點,如果事情還不存在。思考?

感謝

回答

10

假設你使用的是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"], ...} 
} 
+3

事實證明你可以這樣做:JSONObject json = new JSONObject(slingHttpServletRequest.getParameterMap());以及 - 你的方法確實可以更好地控制允許進入json對象的內容(例如引入白名單/黑名單) - 這很好。 – empire29

+0

嗨,我已經從上面提供的鏈接下載了JSON庫。我現在怎麼使用它。你可以提一下嗎? –

+0

@ empire29:對此的更多見解非常可觀。 –

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 
0

使用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