如何将POJO转换为Android上的可读字符串以进行调试?

时间:2017-12-15 17:57:57

标签: android json gson

给出以下纯文本JSON对象

class Chat {

    String id;
    String title;
    List<String> messages;

}

如何覆盖toString以使其仅供调试使用

3 个答案:

答案 0 :(得分:3)

您可以将其序列化为JSON字符串:

class Chat {

    private static final GSON = new GSON();

    String id;
    String title;
    List<String> messages;

    public String toString() {
        return BuildConfig.DEBUG ? GSON.toJson(this) : super.toString();
    }

}

答案 1 :(得分:1)

您自己的解决方案有效但不太通用。我会创建一个帮助类(如果不想在每个打印上进行内联)

public class PrettyPrinter {

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

   public static String print(Object o) {
      return gson.toJson(o);
   }

}

所以你可以

PrettyPrinter.print(chat);

如果你坚持使用toString(),那么它将是

@Override
public String toString() {
   return isDebugEnabled() ? PrettyPrinter.print(this) : super.toString();
   // or BuildConfig.DEBUG ? ...;
}

或者你想通过扩展像这样的类来实现它

public class JsonPrintable {

   public String toString() {
      return isDebugEnabled() ? PrettyPrinter.print(this) : super.toString();
   }
   /**
    * this should be logging dependent implementation
    * @return
    */
   public boolean isDebugEnabled() {
      return log.isDebugEnabled(); // personally use slf4j for logging... 
      // or return BuildConfig.DEBUG;
   } 
}

所以

public class Chat extends JsonPrintable { ... }

答案 2 :(得分:0)

只需将其添加到聊天

即可
@Override
public String toString() {
    return "\nIngrediente{" +
            "\n\tid='" + id + '\'' +
            "\n\ttitle='" + title + '\'' +
            "\n\tmessages=" + messages +
            "\n}";
}

请注意,ArrayList已经可以打印,此时您可以轻松

Chat chat = new Chat();
Log.d("Printing!", chat);

适合我。

enter image description here

<强>更新

我前一段时间使用过toString,我在stackoverflow上找到它并编辑了一下,但我不记得源链接:

@Override
public String toString() {
    StringBuilder result = new StringBuilder();
    String newLine = System.getProperty("line.separator");

    result.append( this.getClass().getName() );
    result.append( " Object {" );
    result.append(newLine);

    //determine fields declared in this class only (no fields of superclass)
    Field[] fields = this.getClass().getDeclaredFields();

    //print field names paired with their values
    for ( Field field : fields  ) {
        result.append("  ");
        try {
            if (field.isSynthetic() || field.getName().equals("serialVersionUID"))
                continue;
            result.append( field.getName() );
            result.append(": ");
            //requires access to private field:
            result.append( field.get(this) );
        } catch ( IllegalAccessException ex ) {
            System.out.println(ex);
        }
        result.append(newLine);
    }
    result.append("}");

    return result.toString();
}

稍微调整一下你可以实际打印任何pojo中的所有属性,而不必每次都添加它们 toString