如何在Java中打印对象而不出现“SomeType@2f92e0f4”的情况?

410

我有一个定义如下的类:

public class Person {
  private String name;

  // constructor and getter/setter omitted
}

我尝试打印我的类的实例:

System.out.println(myPerson);

但是我得到了以下输出:com.foo.Person@2f92e0f4

当我尝试打印一个Person对象的数组时,发生了类似的事情:

Person[] people = //...
System.out.println(people); 

我得到了输出:[Lcom.foo.Person;@28a418fc

这个输出是什么意思?我如何更改输出,使其包含我的人员姓名?我如何打印我的对象集合?

注意:这被认为是关于此主题的规范问答。


3
你可以使用GSON库将对象转换为JSON,反之亦然。非常有用于调试。 - Ashish Rawat
请参考 https://dev59.com/cIbca4cB1Zd3GeqPU1-9 - Raedwald
14个回答

3

我使用Spring 5中的Jackson完成了这个任务。根据对象的不同,它可能无法在所有情况下工作。

import com.fasterxml.jackson.databind.ObjectMapper;
    
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(yourObject));

输出结果将会是:

{
  "id" : 1,
  "fieldOne" : "string"
}

这里有更多使用Jackson的示例。

如果你使用GSON,它可能会像这样:

Gson gson = new Gson();
System.out.println(gson.toJson(yourObject));

1
Gson gson = new Gson(); System.out.println(gson.toJson(yourObject)); - Harikrushna Patel

3

在类上使用Lombok的@Data注解会提供getter、setter、toString和hashcode。使用Lombok会更好,因为它能处理样板代码。


有帮助的,此外您可以使用@ToString注释,当使用关系时,Data注释存在问题。 - Donald Kagunila

2
如果您正在使用项目Lombok,您可以使用@ToString注释并生成标准的toString()方法,而不需要添加样板代码。
import lombok.ToString;

@ToString
public class LoginDto {
  private String user;
  private String pass;
}

...
System.out.println(loginDto.toString());
// LoginDto(user=x@xxx.x, pass=xxxxx)

1

如果您不想覆盖 toString() 方法,您可以使用这个方法:

    public static void printJson(Object o) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(o);
            System.out.println(json);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

我们还需要导入:

import com.fasterxml.jackson.databind.ObjectMapper;

我们可以创建一个工具方法,这将非常方便。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接