json的一些屬性用法

首先看下面的配置文件中的兩種寫法:固然Action所在的包必須繼承json-default:

<package name="default" extends ="json-default" >
html

第一種:java

<action name="upload_*" class="uploadAction" method="{1}">  
    <result type="json">  
        <param name="root">fileName</param>  
    </result>  
</action>

 

第二種:android

<action name="uploadJson" class="uploadJsonAction" method="upload">  
     <result type="json" name="success"></result>           
</action>


固然,兩種方式都能達到相應的效果,可是開發中咱們建議使用第一種正則表達式

 

  • 第一種指定了struts2須要幫你轉換成的json的Action中bean的屬性:filename;也就是struts2只會調用getFileName()這一個get方法,忽略其餘bean屬性的的get*方法,天然節省了很多資源。
  • 第二種沒有指定須要轉換成json的屬性,只要Action中有get*方法的,strut2都會幫你轉換,你節省的代碼換來了程序沒必要要的開支。

 

可是,strut2的開發者顯然作的比較得當,下面的註解方式能夠幫你改進很多你的代碼,固然我的以爲仍是加上root方便、簡單:json

  • @JSON(serialize=false) :若是你不想讓某個屬性被json序列化,只要在其get*方法上面加上如下註解便可;
  • @JSON(name="newName"):返回的json數據中名稱是指定的新名稱
  • @JSON(format ="yyyy-MM-dd'T'HH:mm:ss")設置用於格式化輸出、解析日期表單域的格式。
  • @JSON(deserialize=true)設置是否反序列化該屬性

下面看看其餘幾種配置的寫法:測試

 

第三種:excludeNullProperties 參數:表示是否去掉空值, 默認值是false,若是設置爲true會自動將爲空的值過濾,只輸出不爲空的值。google

<result type="json">     
       <param name="excludeNullProperties">true</param>     
    </result>

第四種: ignoreHierarchy 參數:表示是否忽略等級,也就是繼承關係,好比:TestAction繼承於BaseAction,那麼TestAction中返回的json字符串默認是不會包含父類BaseAction的        屬性值,ignoreHierarchy值默認爲true,設置爲false後會將父類和子類的屬性一塊兒返回。spa

<result type="json">     
    <param name="ignoreHierarchy">false</param>     
</result>

 


第五種: includeProperties 參數:輸出結果中須要包含的屬性值(若是屬性是對象的引用,若要json化引用的全部屬性,則使用person.*),這裏正則表達式和屬性名匹配,能夠用「,」分割填充多個正則表達式。code

<result type="json">     
    <param name="includeProperties">person.*, person\.name</param>     
</result>


第六種:excludeProperties 參數:輸出結果須要剔除的屬性值,也支持正則表達式匹配屬性名,能夠用「,」分割填充多個正則表達式,orm

<result type="json">     
    <param name="excludeProperties ">person.*, person\.name</param>     
</result>


下面講講幾種特殊的狀況:

action 代碼:

public class TestingAction extends ActionSupport {  
  
    private static final long serialVersionUID = 1L;  
    private static Log log = LogFactory.getLog(TestingAction.class);  
      
    private String resultStr = "success";//判斷自測是否成功  
      
    private Integer testHeadId;// 試卷id  
    private String testLineId;// 試題id  
    private String userId;// 登陸用戶的id  
    private String testResult;// 測試結果 google gson拼湊的結果集  
    private TestLine testLine;//該道題目的相關信息  
    public List<ITestLine> testLines;//android端返回的json

Bean:

public class TestLine   implements  
        java.io.Serializable {  
  
    // Fields  
  
    private String testLineId;  
    private TestHead testHead;  
    private Integer type;  
    private Integer sortIndex;  
    private Integer score;  
    private String tigan;  
    private String tizhi;  
    private String jiexi;  
    private String daan;  
    private Timestamp lastUpdateTime;  
    private String lastUpdateBy;

 


上面你們看到,action中有一個對象的引用testLine;而testLine實體中又包含另外一個對象TestHead的引用;其餘的我就不說了,若是你也碰到這種狀況,實體嵌套,那麼使用struts2的json序列化時,默認會幫你序列化這個bean(testLine)中全部的屬性,屬性中若是涉及其餘實體引用時,會繼續幫你序列化該引用(TestHead)的屬性值,就這樣,你有多少層的嵌套,struts2就會幫你序列化多少層,這是你想要的結果嗎?

 

處理這種問題的方法是:咱們只須要告訴struts2我須要序列化那些屬性:咱們拿到通過Hibernate處理的以後的結果oldTestLine以後,須要從新建立咱們須要序列化的對象:

TestLine testLine = new TestLine();

而後將須要的字段set值便可;

testLine .set(oldTestLine.get*);

 

處理須要序列化的集合(list、 map)問題(List<ITestLine> testLines)也是同解;

 

至於比較不錯的json架包,我的推薦google gson。

 

 

推薦篇使用struts2返回各類類型的文章:http://www.open-open.com/lib/view/open1325518231062.html

相關文章
相關標籤/搜索