在Java中使用单个调用(如JSON.stringify)打印整个结构?

在Java中使用单个调用(如JSON.stringify)打印整个结构?,java,Java,如何在Java中打印任何类实例?类似于Javascript中的JSON.stringify()。不需要JSON,任何格式的输出都可以 public class User { public String name, password; public int age; public ArrayList<String> phones; public static void login() { //do something } } U

如何在Java中打印任何类实例?类似于Javascript中的JSON.stringify()。不需要JSON,任何格式的输出都可以

public class User {
    public String name, password;
    public int age;
    public ArrayList<String> phones;
    public static void login() {
        //do something
    }
}

User X = new User;
X.name = "john connor";
X.password = "skynet";
X.age = "33";
X.phones.add("1234567");
X.phones.add("7654321");

System.out.println(printClass(X))

你有两个选择。简单的方法就是重写类的
toString
函数。我不明白你为什么不这么做。在这种情况下,它非常简单

String toString(){
    return "{ name:\""+name+", password: \""+passowrd....
}
第二种选择是使用反射。如果您有一些用于“打印类”的sorta外部类,这会稍微好一点(虽然不是真的)。这方面的伪代码是

StringBuilder s = new StringBuidler();
for(Field f : fields){
    s.append(f.getName() + "\" :\"" + f.get()+ "\"");
}
return s.toString();
然而,这将是昂贵的,因为反射总是如此。另外,如果您首先正确地重写
toString
函数,那么您的
printClass
函数就可以

String printClass(Object o){ return o.toString();}

当然,这再次引出了一个问题:为什么需要
printClass
函数?

您可以使用Apache的commons lang函数


当然,反射速度很慢,所以只能在测试代码中这样做。正常使用时,请使用eclipse的“Source”菜单->generate toString()(或intellij的generate toString()),这将为您提供一个合适的字符串。

有很多方法可以实现您所需的功能。虽然我想知道你为什么需要

  • 重写
    toString()
    方法

    见:

  • >P>如果生成算法太长,则考虑单独的类,如<代码> UserPrettyPrinter < /代码> .<
    public interface UserPrettyPrinter {
      string print(User);
    }
    
    public class PrintUserInJSON implements UserPrettyPrinter {
      string print(User user) {
        //implement the algo here
      }
    }
    
    您还可以实现:

    public class PrintUserInXML implements UserPrettyPrinter {
      string print(User user) {
        //implement the algo here
      }
    }
    
  • 无论是结合数字2还是作为独立类,您都可以编写

    public class PrintObjectBasicAlgo {
      String print(Object obj) {
        /* i write pseudo code here. just ask if you cannot implement this
        this would help: http://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html
    
        Class class = Obj.getClass();
    
        Filed[] allVariables = class.getAllFieldsByReflection();
    
        ArrayList<String> keys = new ArrayList<String>;
        ArrayList<String> values = new ArrayList<String>;
    
        for(Field field : allVariables) {
            Object value = reflectionGetValueOfField( field, obj );
            keys.add( field.getName());
            values.add(value.toString());
        }
    
        now that you have the keys and values, you can generate a string in anyway you like
    
        */
      }
    }
    
    公共类PrintObjectBasicAlgo{
    字符串打印(对象obj){
    /*我在这里写伪代码。只要问问你是否不能实现它
    这将有助于:http://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html
    Class=Obj.getClass();
    field[]allVariables=class.getAllFieldsByReflection();
    ArrayList键=新的ArrayList;
    ArrayList值=新的ArrayList;
    for(字段:allVariables){
    对象值=reflectionGetValueOfField(字段,obj);
    key.add(field.getName());
    value.add(value.toString());
    }
    现在已经有了键和值,您可以以任何方式生成字符串
    */
    }
    }
    
  • 你可以看到。这可能会有帮助


  • 一个选择是使用谷歌Gson

    导入java.util.ArrayList; 导入java.util.List; 导入com.google.gson.gson

    class Project {
    private int year = 1987;
    private String name = "ROBOCOP-1";
    private boolean active = false;
    private List<String> list = new ArrayList<String>() {
      {
        add("PROTECT THE INNOCENT");
        add("UPHOLD THE LAW");
        add("SERVE THE PUBLIC TRUST");
        add("CLASSIFIED");
      }
    };
    }
    
    public class GsonExample {
    public static void main(String[] args) {
        Project obj = new Project();
        Gson gson = new Gson();
        String json = gson.toJson(obj);
        System.out.println(gson.toJson(obj));
    }
    }
    
    类项目{
    私立国际年=1987年;
    私有字符串name=“ROBOCOP-1”;
    private boolean active=false;
    私有列表=新的ArrayList(){
    {
    添加(“保护无辜”);
    添加(“维护法律”);
    添加(“服务公众信托”);
    添加(“分类”);
    }
    };
    }
    公共类gsone示例{
    公共静态void main(字符串[]args){
    项目obj=新项目();
    Gson Gson=新的Gson();
    字符串json=gson.toJson(obj);
    System.out.println(gson.toJson(obj));
    }
    }
    
    您特别想要json,还是只是一个表示?来自commons lang的ToStringBuilder可以做到这一点。。。。虽然不是JSONA,但任何输出格式都会导致反射不是特别慢。这里的用途很好。谢谢你,这就是我想要的。但我找到了谷歌gson,因为它打印了我更熟悉的Json,所以我使用它。
    class Project {
    private int year = 1987;
    private String name = "ROBOCOP-1";
    private boolean active = false;
    private List<String> list = new ArrayList<String>() {
      {
        add("PROTECT THE INNOCENT");
        add("UPHOLD THE LAW");
        add("SERVE THE PUBLIC TRUST");
        add("CLASSIFIED");
      }
    };
    }
    
    public class GsonExample {
    public static void main(String[] args) {
        Project obj = new Project();
        Gson gson = new Gson();
        String json = gson.toJson(obj);
        System.out.println(gson.toJson(obj));
    }
    }