Как игнорировать корневой узел JSON в действии struts2

Я добавил этот метод в действие 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
}

Любая идея получить требуемый ответ без добавления вышеуказанного поля в мой класс действий.


person Said Gamal    schedule 12.05.2015    source источник
comment
Что вы получите, если воспользуетесь <param name="root">simDetails</param> (и удалите includeProperties)?   -  person Andrea Ligios    schedule 12.05.2015
comment
P.S: у вас точно такой же аватар Cletus...   -  person Andrea Ligios    schedule 12.05.2015
comment
Он работает как требуется. большое спасибо, вы можете добавить это как ответ, чтобы принять его   -  person Said Gamal    schedule 12.05.2015


Ответы (2)


Вы можете использовать атрибут root, как указано в корневом объекте. раздел документации:

Используйте атрибут «root» (выражение OGNL), чтобы указать корневой объект для сериализации.

В твоем случае:

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

PS: этот ответ может быть достоин прочтения. И в другом ответе на этот вопрос вы также можете увидеть технику Stream, предложенную @IntelliData.

person Andrea Ligios    schedule 12.05.2015
comment
Если я использовал <param name="root">dLink</param>, он возвращает мне null и <result type="json" name="success"> работает, и я не хочу, чтобы все атрибуты были ответом, почему это так, любое предложение, пожалуйста - person Shantaram Tupe; 21.06.2017
comment
Конечно ;) Это потому, что ваша переменная имеет первое слово длиной в одну букву, а Eclipse генерирует геттер getdLink вместо getDLink, как нужно Struts2. Просто вручную измените геттер в public String getDLink(){ return dLink;} и все заработает. О, и подумайте о том, чтобы проголосовать за этот ответ, спасибо @shantaram_t. - person Andrea Ligios; 21.06.2017
comment
сэр, это решило мою проблему, но для моего запроса Ajax, но другой, делающий то же самое, сейчас не работает. О, я проголосовал за ваш ответ - person Shantaram Tupe; 21.06.2017
comment
То, что сейчас не работает, вероятно, связано с использованием неправильного геттера/сеттера в JSP, и вам нужно изменить их на правильный синтаксис теперь, когда вы изменили геттер и сеттер. Кстати, избегайте переменных с первым длинным словом из одной буквы на будущее :) - person Andrea Ligios; 21.06.2017
comment
на самом деле это не мой код, я его повторно использую, тогда я буду использовать свою переменную. - person Shantaram Tupe; 21.06.2017
comment
Мудрый выбор @shantaram_t :) - person Andrea Ligios; 21.06.2017

Чтобы избежать той же самой проблемы, я обычно возвращаю JSON, используя следующий struts.xml (в отличие от возвращаемого типа JSON):

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

I keep a variable 'inputStream' of type 'InputStream' in my action class, and in the execute() method, I manually assign the JSON to 'inputStream'. That allows me to customize the JSON exactly as I want it, and that is precisely what 'inputStream' will return.

Надеюсь, это поможет!

person IntelliData    schedule 12.05.2015