java-将复杂java对象转换为json
我有一个像下面这样的班级-java-将复杂java对象转换为json,java,json,Java,Json,我有一个像下面这样的班级- public class Person { private String firstName; private String lastname; private Address address; // getters and setters } public class Address { private String streetName; private String postCode; privat
public class Person {
private String firstName;
private String lastname;
private Address address;
// getters and setters
}
public class Address {
private String streetName;
private String postCode;
private Contact contact;
// getters and setters
}
public class Contact {
private String telephone;
private String email;
// getters and setters
}
我使用gson库将其转换为json对象,如下所示-
Gson gson = new GsonBuilder()
.serializeNulls()
.setPrettyPrinting()
.create();
System.out.println(gson.toJson(new Person()));
然后我得到了类似的json-
{
"firstName": null,
"lastname": null,
"address": null
}
{
"firstName": null,
"lastname": null,
"address": {
"streetName": null,
"postCode": null,
"contact": {
"telephone": null,
"email": null
}
}
}
但我正在寻找一个类似json的-
{
"firstName": null,
"lastname": null,
"address": null
}
{
"firstName": null,
"lastname": null,
"address": {
"streetName": null,
"postCode": null,
"contact": {
"telephone": null,
"email": null
}
}
}
谁能帮我实现这个目标 只需将Person类更改为
public class Person {
private String firstName;
private String lastname;
private Address address;
public Person() {
this(new Address());
}
public Person(Address address) {
this.address = address;
}
// getters and setters
}
否则没有地址,因此JSON中的null我认为您获得的结果JSON是预期的:
new Person()。Address
字段为null(如果您没有在Person
的构造函数中初始化它),因此它被序列化为null
您正在搜索的输出对应于以下内容的序列化
Person p = new Person();
Address a = new Address();
a.setContact(new Contact());
p.setAddress(a);
gson.toJson(p);
这是一个
Person
的实例,不同于new Person()
…您应该将address作为对象添加到Person类中
修改您的代码
-将构造函数添加到Person take address对象作为参数
public class Person {
private String firstName;
private String lastname;
private Address address;
public Person(Address address) {
this.address=address;
}
// getters and setters
}
然后将打印行替换为以下行:
System.out.println(gson.toJson(new Person(new Address())));
您需要实际创建一个
Address
实例,其中填充null
s-JSON转换器将带有值null
的字段Address
转换为null
以外的任何内容都是毫无意义的null
与新地址(null,null)
非常不同。我认为最好通过构造函数或setter@JoakimDanielson我完全同意。但是我想在asker提供的示例代码中非常清楚地显示问题所在的位置。我已将示例编辑为最佳实践。是否有自动初始化类的成员变量的方法?@Vibs请参阅我的答案。您可以为在定义位置添加赋值的类字段设置默认值,如@George Derpi的响应中所示,或者您可以通过构造函数的参数os setter来设置它们的值:imho构造函数注入更可取,但如果您的类是DTO setter注入也有意义。内联字段初始化对于实现某些相关功能的协作者来说是可以的,但对于数据成员来说不是。。。但最后一个正确的选择取决于您:它取决于您在其中使用这些类的上下文。