如何忽略struts2动作中的根JSON节点

时间:2015-05-12 13:47:08

标签: java json struts2 struts2-json-plugin struts-action

我在struts动作中添加了这个方法,

public String execute() {
    long start = System.currentTimeMillis();
    simDetails = new SIMDetails();
    return GET_SIM_DETAILS;
}

并在struts配置文件中添加以下操作,

<result type="json" name="getSIMDetails">
    <param name="noCache">true</param>
    <param name="includeProperties">simDetails.*</param>
</result>

然后我得到了JSON响应

{
    "simDetails": {
        "void": null,
        "ban": null,
        "currentTariff": null,
        "currentTariffDescription": null,
        "defaultTariff": null,
        "defaultTariffDescription": null,
        "imsi": null,
        "packageItemId": null,
        "simSerialNumber": null,
        "simStatus": null,
        "simStatusCC": null,
        "status": null,
        "subscriberNumber": null,
        "subsidaryCode": null
    }
}

但是我需要这个响应而不是上面的,

{
    "void": null,
    "ban": null,
    "currentTariff": null,
    "currentTariffDescription": null,
    "defaultTariff": null,
    "defaultTariffDescription": null,
    "imsi": null,
    "packageItemId": null,
    "simSerialNumber": null,
    "simStatus": null,
    "simStatusCC": null,
    "status": null,
    "subscriberNumber": null,
    "subsidaryCode": null
}

如果想要获得所需的响应,请将上述字段添加到我的操作类中。

2 个答案:

答案 0 :(得分:2)

您可以使用文档Root Object部分中指定的root属性:

  

使用“root”属性(OGNL表达式)指定要序列化的根对象。

在你的情况下:

<result type="json" name="getSIMDetails">
    <param name="noCache">true</param>
    <param name="root">simDetails</param>
</result>

P.S:this answer可能值得一读。在该问题的另一个答案中,您还可以看到@IntelliData建议的Stream技术。

答案 1 :(得分:0)

为了避免同样的问题,我通常使用以下struts.xml返回JSON(而不是JSON返回类型):

                <result name="success" type="stream">
                    <param name="contentType">text/html</param>
                    <param name="inputName">inputStream</param>
                </result>

我在我的动作类中保留了一个'InputStream'类型的变量'inputStream',在execute()方法中,我手动将JSON分配给'inputStream'。这允许我完全按照我的意愿自定义JSON,这正是'inputStream'将返回的内容。

希望有所帮助!