2012-09-04 172 views
1

我使用struts2的行動和jQuery UI爲...將Java對象轉換爲JSON?

我想知道如何將一個Map對象轉換成JSON對象,併發送回UI,

現在能夠打印在JSP頁面中的普通的Java Map對象:

{71=Heart XXX, 76=No Heart YYY} 

但我希望它是這樣的:

{71:Heart XXX, 76:No Heart YYY} 

我將如何做到這一點....?

回答

1

嘗試Gson

Gson gson = new Gson(); 
String json = gson.toJson(yourMap); 

我不會建議把這樣的代碼放到一個JSP,雖然。像這些東西應該像Servlet或Action類一樣存在於控制器中。

也最肯定不希望的輸出是:

{71:Heart XXX, 76:No Heart YYY} 

而是正確的JSON像(報價名稱,引用的字符串值):

{"71":"Heart XXX", "76":"No Heart YYY"} 

GSON將輸出後者。

+0

謝謝...但我已經使用它,並得到它...但根據我的要求,我不應該使用這個你可以建議任何其他方式 – Esh

+1

如果你不允許使用Gson,看看[傑克遜](http://wiki.fasterxml.com/JacksonHome)甚至是[json.org/java](http://json.org/java/)(後者實際上很簡單並且很難使用IMO)。如果你不允許使用任何庫,那麼你將很難獲得JSON的結構和轉義。不要那樣做,使用圖書館。 –

+0

謝謝你......我會盡力讓你知道 – Esh

1

http://www.json.org/上有一堆用於Java的JSON庫。 我會檢查出其中的一個。

+2

雖然這是一個有效的答案,但它應該嘗試解釋爲什麼要放棄內置的struts 2 json支持,並下降到更勞動密集的較低級解決方案。 – chad

6

我個人使用struts2-json這個插件。它非常易於使用,您可以通過struts.xml條目輕鬆地將Map轉換爲Json,反之亦然。 創建一個地圖和它的getter/setter。

private Map<String, String> map= new HashMap<String, String>(); 

struts.xml與會話堆棧增加攔截器一起定義一個全局的結果

<result-type name="json" class="org.apache.struts2.json.JSONResult" default="false" /> 

<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor" /> 

<action name="YouAction" class="YourActionClass" method="executeMethod"> 
     <result type="json"></result> 
</action> 

More documentation can be found here

2

爲了增加Ashish的答案,那就是添加Struts2的,JSON-插件後。

我喜歡在可能的情況下使用struts2-conventions-plugin,因爲我的struts.xml中只有很少的東西,而傾向於使用大多數註釋。

爲了讓您的操作在使用約定時返回json,有兩個步驟:1)讓您的操作使用json-default包; 2)將操作定義爲具有json結果類型。

JSON註解例

package org.test.action; 

import com.opensymphony.xwork2.ActionSupport; 
import org.apache.struts2.convention.annotation.ParentPackage; 
import org.apache.struts2.convention.annotation.Result; 
@ParentPackage("json-default") 
@Result(type = "json") 
public class JsonTest extends ActionSupport{ 
    private String name = "Hello World"; 
    private String language = "Java, I mean English"; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getLanguage() { 
     return language; 
    } 

    public void setLanguage(String language) { 
     this.language = language; 
    } 
} 

有時比原語值更復雜,你將要修剪JSON返回,或有時你會希望把多個行動統一到一個單獨的類(有時你回來一個複雜的結構,並通過某種方式修剪它,使您可以更輕鬆地在客戶端上進行工作)。爲此,我們使用包含或排除參數。

例排除語言

修改上述結果的註釋是:

@Result(type = "json", params = { 
    "excludeProperties", 
    "language"}) 

另一種方式來實現上述的明確聲明,我們不想要什麼屬性:

@Result(type = "json", params = { 
    "includeProperties", 
    "name"}) 

示例使用排除參數的通配符未提供行動代碼,適合修剪複雜的對象

@Result(type = "json", params = { 
    "excludeProperties", 
    "punches.*.punchesCollection, *.punchesCollection.*"}) 

您可以用插件這是非常難以得到比任何XML或標註方法容易看到。