Print whole structure with single call (like JSON.stringify) in Java?

后端 未结 4 1815
难免孤独
难免孤独 2021-01-21 19:49

How to print any class instance in Java? Similar to JSON.stringify() in Javascript. Not necessary JSON, any format of output will do.

public class User {
    pub         


        
相关标签:
4条回答
  • 2021-01-21 20:07

    You have two options here. The simple one is just to override the toString function for your class. I dont see why you dont do this really. In this case its as simple as

    String toString(){
        return "{ name:\""+name+", password: \""+passowrd....
    }
    

    The second option is to use reflection. This would be slightly (though not really) better if you had some sorta external class used for "printing classes". The pseudo code for that would be

    StringBuilder s = new StringBuidler();
    for(Field f : fields){
        s.append(f.getName() + "\" :\"" + f.get()+ "\"");
    }
    return s.toString();
    

    However this would be costly as reflection always is. Also if you just properly override the toString functions in the first place your printClass function could literally just be

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

    Which of course again begs the question of why do you need a printClass function?

    0 讨论(0)
  • 2021-01-21 20:16

    One option is to use Google Gson.

    import java.util.ArrayList; import java.util.List; import 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));
    }
    }
    
    0 讨论(0)
  • 2021-01-21 20:20

    There could be many ways to achieve what you need. Though i would be interested in why you need.

    1. Override the toString() method.

      see: http://www.javapractices.com/topic/TopicAction.do?Id=55

    2. If the generation algorithm gets too long, then consider a separate class say UserPrettyPrinter.

      public interface UserPrettyPrinter {
        string print(User);
      }
      
      public class PrintUserInJSON implements UserPrettyPrinter {
        string print(User user) {
          //implement the algo here
        }
      }
      

      you can also implement:

      public class PrintUserInXML implements UserPrettyPrinter {
        string print(User user) {
          //implement the algo here
        }
      }
      
    3. Either in conjugation to number-2 or as a standalone class, you can write

      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
      
          */
        }
      }
      
    4. You may see Visitor Pattern. it might be helpful.

    0 讨论(0)
  • 2021-01-21 20:24

    You can use Apache's commons-lang's ToStringBuilder.reflectionToString

    Of course, reflection is slow, so only do this with your test code. for normal use, please use eclipse's "Source" menu -> generate toString() (or intellij's generate toString()) which gives you a decent string.

    0 讨论(0)
提交回复
热议问题