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

tor*_*tal 38 java orm json gson

@Override 
public String toString() { 
    return new Gson().toJson(this);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ana*_*ika 68

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

实现toString方法的方法很少.

  1. 思考(Apache库)

    @Override
    public String toString(){
        return org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(this);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. ToStringBuilder(与apache-commons库一起提供)

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

    @Override
    public String toString() {
        return new StringBuilder()
            .append("field1:"+field1)
            .append("field2:"+field2)
            .toString();
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 惊人的答案,非常详细的几个选项和几行.这应该是公认的. (3认同)
  • 可以通过讨论 [toString](https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString()) 的契约以及 JSON 序列化是否满足来改进答案该合同(我认为确实如此)以及任何潜在的缺点(性能?但被合同减轻了 - 该方法用于调试/显示,因此预计不会有性能) (2认同)

Ego*_*uba 9

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

static Gson gson = new GsonBuilder().setPrettyPrinting().create();
Run Code Online (Sandbox Code Playgroud)

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

  • 我用谷歌搜索后得到了它.应该先做到这一点.使用漂亮的打印将非常有用 (2认同)

JWT*_*JWT 7

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

(抱歉,上面没有足够的代表发表评论)