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注入也有意义。内联字段初始化对于实现某些相关功能的协作者来说是可以的,但对于数据成员来说不是。。。但最后一个正确的选择取决于您:它取决于您在其中使用这些类的上下文。