2013-10-05 1 views
1

Java로 클래스 인스턴스를 인쇄하는 방법은 무엇입니까? Javascript의 JSON.stringify()와 유사합니다. JSON이 필요하지 않습니다. 출력 형식이 달라집니다.Java에서 JSON.stringify와 같은 단일 호출로 전체 구조를 인쇄 하시겠습니까?

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)) 

해야 하는가와 같은 출력 뭔가 : 당신은 여기에 두 가지 옵션이 있습니다

{ name:"john connor", password: "skynet", age: "33", phones: 
    ["1234567", "7654321"], login: void function() } 
+0

구체적으로 json을 원하십니까, 아니면 단지 표현을 원하십니까? commons-lang의 ToStringBuilder가이 작업을 수행합니다 .... altho not json – MeBigFatGuy

+0

임의의 출력 형식을 사용하면 – exebook

답변

3

당신은 그렇게 만 테스트 코드와 함께이 작업을 수행, 과정의 ToStringBuilder.reflectionToString

, 반사가 느린 아파치 - 랭 공유지를 사용할 수 있습니다. 정상적인 사용을 위해 이클립스의 "Source"메뉴 -> toString() (또는 intellij의 generate toString())을 사용하여 적절한 문자열을 제공하십시오.

+0

반사가 특히 느리지 않습니다. 여기 사용은 완벽합니다. – MeBigFatGuy

+0

감사합니다. 이것이 내가 원하는 것입니다. 하지만 Google gson을 찾았습니다. Json이 나에게 익숙한 것을 인쇄 했으므로이를 사용합니다. – exebook

1

은. 간단한 것은 단지 클래스의 toString 함수를 오버라이드하는 것입니다. 나는 왜 당신이 이것을 정말로하지 않는지에 관해 안다. 이 경우 간단하다.

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

두 번째 옵션은 리플렉션을 사용하는 것이다. 이것은 "인쇄 클래스"에 사용되는 일종의 외부 클래스가있는 경우 약간 (실제로는 아님) 좋을 것입니다. 그 의사 코드는

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

이 될 것입니다. 그러나 이것은 항상 반영으로 값이 비쌉니다. 그냥 제대로 첫번째 장소에있는 toString 기능을 무시할 경우에도 귀하의 printClass 기능은 말 그대로 단지 다시는 printClass 기능을 필요로 왜의 질문을 구걸 물론

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

을 수 있을까?

2

필요한 것을 얻기 위해 여러 가지 방법이있을 수 있습니다. 비록 내가 에 관심이 있으시다면이 필요하십니까?

  1. toString() 메서드를 재정의하십시오.

    은 다음을 참조하십시오 http://www.javapractices.com/topic/TopicAction.do?Id=55 생성 알고리즘이 너무 길어질 경우

  2. 는 다음 별도의 클래스가 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 
        } 
    } 
    
  3. 어느 결합에 에 수-2 또는 독립 클래스로, 당신은 당신이 Visitor Pattern를 볼 수 있습니다

    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. 을 쓸 수 있습니다 . 도움이 될 수 있습니다.

0

하나의 옵션은 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)); 
} 
} 
관련 문제