Вопрос по struts2, json, jquery, javascript – Преобразование Java-объекта в JSON?
Я использую Struts2 для действий и JQuery для пользовательского интерфейса ...
Я хочу знать, как преобразовать объект карты в объект JSON и отправить его обратно в пользовательский интерфейс,
Теперь я могу напечатать на странице JSP обычный объект Java-карты:
{71=Heart XXX, 76=No Heart YYY}
Но я хочу, чтобы это было так:
{71:Heart XXX, 76:No Heart YYY}
Как я достигну этого ....?
Пытаться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 выведет последнее.
то есть после добавления плагина struts2-json.
Мне нравится, когда это возможно, использовать плагин struts2 -ventionss, поэтому в моем файле struts.xml очень мало и я предпочитаю использовать в основном аннотации.
Чтобы ваше действие возвращало json при использовании условных обозначений, есть два шага: 1) заставить ваше действие использовать пакет json-default, 2) определить действие как имеющее тип результата json.
JSON Annotations Example
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, или иногда вы захотите поместить несколько действий в один класс (иногда вы возвращаете сложную структуру и, обрезая ее определенными способами, можете выполнять свою работу на клиент проще). Для этого мы используем параметры include или exclude.
Example exclude language
Измените приведенную выше аннотацию результата так:
@Result(type = "json", params = {
"excludeProperties",
"language"})
Другим способом достижения вышесказанного является явное указание, какие свойства мы хотим:
@Result(type = "json", params = {
"includeProperties",
"name"})
Example Using wild cards with exclude parameter Action code not supplied, good for trimming complicated objects
@Result(type = "json", params = {
"excludeProperties",
"punches.*.punchesCollection, *.punchesCollection.*"})
Вы можете видеть, что с плагином довольно сложно получить что-либо проще, чем метод xml или аннотации.
Есть несколько библиотек JSON для Java наhttp://www.json.org/. I would check out one of those.
Я лично пользуюсьstruts2-json
плагин для этого. Он очень прост в использовании, и вы можете легко конвертировать Map в Json и наоборот через некоторые записи struts.xml.
Создать карту и ее геттер / сеттеры.
private Map<String, String> map= new HashMap<String, String>();
Определите глобальный результат как
<result-type name="json" class="org.apache.struts2.json.JSONResult" default="false" />
в вашемstruts.xml
наряду с добавлением перехватчика в стеке ваших сеансов.
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor" />
<action name="YouAction" class="YourActionClass" method="executeMethod">
<result type="json"></result>
</action>