gpt4 book ai didi

java - 如何在GWT中使用autobean将json转换为java类

转载 作者:行者123 更新时间:2023-11-30 06:32:30 27 4
gpt4 key购买 nike

我在 gwt 中有一个 Person 类,并且我已经发送了 Person 的实例,其中使用 Gson 转换了 servlet > 从服务器到客户端。但在客户端似乎我无法使用Gson。从我在论坛中读到的内容来看,最好的方法似乎是使用 AutoBeans 再次将 Json 转换为对象 Person

但是在AutoBeans中我只能使用一个接口(interface)。如果有人能帮我写,我将不胜感激。

我从服务器获取的 json 示例,想要再次转换为 Person 类:

{"name":"aaa","family":"fff","username":"uuu","age":20,"phones":[{"id":0,"phoneNumber":"0911111"}],"relatives":[null]}

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() {
// ....
}
}

最佳答案

是的,正如 Tobika 所评论的,另一个答案表明 AutoBeans 需要一个接口(interface)。如果您在客户端和服务器端都使用 AutoBeans,并且将所有模型定义为接口(interface),那么 AutoBeans 效果会更好。

如果你想使用你的类模型,你可以使用 GWT Jackson,它与 AutoBeans 非常相似,但它使用你的模型,将 json 绑定(bind)到你的模型(就像其他服务器端库;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 中的继承,这是我最喜欢的选择。但这具有超轻量级的巨大优势(实际上零开销映射开销和零代码开销,因为它使用 native 解析并且没有副本,直接访问解析的 json 对象)。限制:不能使用继承,“损坏的类型系统”(所有 X instanceof SomeDtoType 总是返回 true,因为所有 DTO 都是 Object 类型,这是有意义的,因为我们实际上使用的是解析的 JSON),不能仅使用 native 数组的集合(但要感谢 java8 Stream 这应该不是问题,无论您想从 Stream.of(arr) 开始做什么),并且仅支持 Double 和 Boolean 装箱类型(不支持任何花哨的类型,如 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 方案。但有一个很大的优势,这个 DTO 可以开箱即用地与大多数服务器端解析器配合使用。 Jackson和GSON将进行编码和解析,无需任何配置。

关于java - 如何在GWT中使用autobean将json转换为java类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45814893/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com