Как использовать autobean для преобразования JSON в Java-класс в GWT
У меня есть класс Person
в gwt
и я отправил экземпляр Person
с сервлетом, преобразованным с помощью Gson
от сервера к клиенту. Но на стороне клиента, кажется, я не могу использовать Gson
, Из того, что я читал на форумах, кажется, что лучший способ использования AutoBeans
преобразовать Json
для объекта Person
снова.
Однако в AutoBeans
Я могу использовать только интерфейс. Я буду признателен, если кто-нибудь может помочь мне написать это.
json
пример я получаю с сервера и хочу преобразовать в Person
снова класс
{"Имя": "ааа", "семья": "FFF", "имя пользователя": "ууу", "возраст":20,"телефоны":[{"ID":0,"PHONENUMBER":"0911111"}],"родственники": [пустой]}
public class Person implements Serializable {
private String name;
private String family;
private String username;
private int age;
private List<Phone> phones;
private List<Person> relatives;
public Person() {
}
public Person(String name, String family, String username, int age, List<Phone> phones, List<Person> relatives) {
this.name = name;
this.family = family;
this.username = username;
this.age = age;
this.phones = phones;
this.relatives = new ArrayList<Person>();
this.relatives = relatives;
}
public void addPhone(Phone p) {
phones.add(p);
}
public String getName() {
return this.name;
}
public String getFamily() {
return this.family;
}
public int getAge() {
return this.age;
}
public String getUsername() {
return this.username;
}
public List<Phone> getNumbers() {
return this.phones;
}
public List<Person> getRelatives() {
return this.relatives;
}
public String getAllNumbers() {
return Phone.convertPhonesToText(phones);
}
public static Person findPerson(List<Person> personList, String username) {
// .....
}
public static List<Person> convertTextToPersons(List<Person> personList, String personsText) {
// .....
}
public String convertPersonsToText() {
// ....
}
}
1 ответ
Да, как прокомментировал Тобика, другой ответ указывает, что AutoBeans требует Интерфейс. AutoBeans работает лучше, если вы используете его с обеих сторон, со стороны клиента и сервера, и вы определяете все свои модели как интерфейсы.
Если вы хотите использовать свои модели классов, вы можете использовать GWT Jackson, который очень похож на AutoBeans, но он использует ваши модели, привязывая json к вашей модели (как и другие библиотеки на стороне сервера: jackson, gson и т. Д.): https://github.com/nmorel/gwt-jackson
public static interface PersonMapper extends ObjectMapper<Person> {}
@Override public void onModuleLoad() {
PersonMapper mapper = GWT.create(PersonMapper.class);
String json = mapper.write(new Person("John", "Doe"));
GWT.log( json ); // > {"firstName":"John","lastName":"Doe"}
Person person = mapper.read(json);
GWT.log(person.getFirstName() + " " + person.getLastName());
}
Кроме того, вы можете использовать просто GWT с JsInterop. Это имеет много ограничений, но даже с этим ограничением, это довольно хороший вариант. Это мой любимый вариант, если вы можете избежать наследования в ваших DTO. Но это имеет большое преимущество, заключающееся в том, что он является сверхлегким (на самом деле это накладные расходы на отображение с нулевыми накладными расходами и накладные расходы с нулевым кодом, так как он использует собственный синтаксический анализ и отсутствие копий, обращаясь непосредственно к проанализированному объекту json). Ограничения: нельзя использовать наследование, "система с нарушенным типом" (все X instanceof SomeDtoType всегда возвращает true, поскольку все DTO имеют тип Object, что имеет смысл, поскольку мы на самом деле используем проанализированный JSON), не может использовать коллекции только для собственных массивов (но благодаря java8 Поток это не должно быть проблемой, независимо от того, что вы хотите сделать с запуском с Stream.of(arr)), и поддерживаются только двойные и логические коробочные типы (не поддерживаются любые причудливые типы, такие как Date или BigInteger, не поддерживаются long/Long)..).
@JsType(isNative=true, package=GLOBAL, name="Object") final class Person {
// you can use getter/setter but as this class is final DTO adds no value
public String firstName; public String lastName; public Phome[] numbers;
// you can add some helper methods, don't forget to skip serialization!
public final @JsOverlay @JsonIgnore List<Phone> getNumberList() {
return Stream.of(numbers).collect(Collectors.toList());
}
}
@JsType(isNative=true, package=GLOBAL, name="Object) final class Phone {
public String number;
}
@JsMethod(namespace = "JSON") public static native <T> T parse(String text);
@Override public void onModuleLoad() {
Person person = parse("{\"firstName\":\"John\",\"lastName\":\"Doe\"}");
GWT.log(person.firstName + " " + person.lastName);
}
Эти простые и ограниченные DTO являются скорее схемой DTO, чем типом. Но имеет большое преимущество, это DTOs работает из коробки с большинством парсеров на стороне сервера. Джексон и GSON будут кодировать и анализировать без какой-либо конфигурации.