可以使用JSON输出作为toString()的默认值吗?

时间:2013-05-13 17:39:45

标签: java json orm gson

@Override 
public String toString() { 
    return new Gson().toJson(this);
}

我是否通过简单地将此作为我的模型对象的默认行为来打破一些好的做法,“Joshua”-pattern 事物,一般设计模式或其他约定?

toString()无论如何只会用于我们当前使用的范例(Android)中的调试。这也是我喜欢在JSON中看到对象的原因,因为很多ORM / json持久性将通过http-> php / python-> mysql和本地SQLite发生。

4 个答案:

答案 0 :(得分:61)

是。可以使用GSON / Jackson / Reflections库来实现toString()方法。

实现toString方法的方法很少。

  1. 思考(Apache库)

    @Override
    public String toString(){
        return org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(this);
    }
    
  2. 基于JSON的实现(GSON,Jackson库)

    // GSON library for JSON
    @Override
    public String toString(){
        return new com.google.gson.Gson().toJson(this);
    }
    
    // Jackson libabry for JSON/YAML
    @Override
    public String toString() {
        try {
            return new com.fasterxml.jackson.databind.ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
        } catch (com.fasterxml.jackson.core.JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
    
  3. ToStringBuilder(可与apache-commons库一起使用)

    @Override
    public String toString() {
        return new org.apache.commons.lang3.builder.ToStringBuilder(this).
            append("field1", field1).
            append("field2", field2).
            toString();
    }
    
  4. 硬核toString()实现

    @Override
    public String toString() {
        return new StringBuilder()
            .append("field1:"+field1)
            .append("field2:"+field2)
            .toString();
    }
    
  5. Lombok注释:在编译时生成toString()

    import lombok.ToString;
    
    @ToString
    public class ToStringExample {}
    

答案 1 :(得分:9)

这样做是没有害处的。我建议你为Gson实例创建一个静态变量并启用漂亮的打印:

static Gson gson = new GsonBuilder().setPrettyPrinting().create();

这样,toString方法的输出将被格式化。

答案 2 :(得分:4)

注意:如果你在toString()方法中使用那个GSon漂亮的打印,它将在调试器中看起来像垃圾,因为它将充满换行符。

(抱歉上面没有足够的回复评论)

答案 3 :(得分:0)

这对性能有害,因为Gson使用内省来确定要打印的字段。

除此之外,我认为没关系。这不是标准的Java toString实现,但我不认为改变它将是一种反模式。