在Java中使用单个调用(如JSON.stringify)打印整个结构?
如何在Java中打印任何类实例?类似于Javascript中的JSON.stringify()。不需要JSON,任何格式的输出都可以在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
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()
方法
见: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
}
}
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));
}
}