programing

Java JSON 시리얼화 - 베스트 프랙티스

cafebook 2023. 4. 3. 21:44
반응형

Java JSON 시리얼화 - 베스트 프랙티스

일부 개체에 대해 JSON 직렬화를 구현해야 하는데 일반 컬렉션과의 통합에 문제가 발생했습니다.

시리얼 가능한 모든 클래스는 이 인터페이스를 구현합니다(JSONObject는 이 라이브러리에서 가져옵니다).

interface JSONSerializable{
    public JSONObject dump() throws JSONException //serializes object
    public void load(JSONObject obj) throws JSONException //deserializes object
}

java.util.list에 기반한 컬렉션 코드는 대략 다음과 같습니다.

class AwesomeList<T extends JSONSerializable> implements JSONSerializable{
    private LinkedList<T> items = new LinkedList<T>();
    ...
    ...

    public JSONObject dump() throws JSONException {
        JSONObject result = new JSONObject();
        JSONArray a = new JSONArray();
        for(T i : items){
            a.put(i.dump());
        }
        result.put("items", a);
        return result;
    }

    public void load(JSONObject obj) throws JSONException{
        //here is my problem
    }
}

문제는 다음과 같습니다.JSONObject에서 AwesomeList를 로드할 때 요소를 작성해야 하는데 Java에서 쓸 수 없기 때문에 불가능합니다.

T newItem = new T();
newItem.load(obj);

이 작업에 대한 접근 방식을 어떻게 수정해야 합니까?

당신은 이 도서관에 묶여 있습니까?구글 지슨은 매우 인기가 있다.Generics에서 사용한 적은 없습니다만, Gson은 Generics의 서포트를 매우 중요하게 생각하고 있습니다.

다른 사람들이 암시했듯이 org.json의 라이브러리를 덤프하는 것을 고려해야 합니다.요즘은 거의 구식이고, 문제를 해결하려고 하는 것은 시간 낭비입니다.

단, 특정 질문에 대해서는 변수 T를 입력하면 컴파일 시간 정보에 불과하기 때문에 도움이 되는 정보가 없습니다.대신 실제 클래스('Class cls' 인수)를 전달하고 'cls.newInstance()'를 사용하여 인스턴스를 만들 수 있습니다.

음, 파일에 쓸 때, 당신은 T 클래스가 무엇인지 알고 있습니다. 그래서 당신은 그것을 저장할 수 있습니다.dump그 후 다시 읽을 때 반사를 사용하여 동적으로 호출할 수 있습니다.

public JSONObject dump() throws JSONException {
    JSONObject result = new JSONObject();
    JSONArray a = new JSONArray();
    for(T i : items){
        a.put(i.dump());
        // inside this i.dump(), store "class-name"
    }
    result.put("items", a);
    return result;
}

public void load(JSONObject obj) throws JSONException {
    JSONArray arrayItems = obj.getJSONArray("items");
    for (int i = 0; i < arrayItems.length(); i++) {
        JSONObject item = arrayItems.getJSONObject(i);
        String className = item.getString("class-name");
        try {
            Class<?> clazzy = Class.forName(className);
            T newItem = (T) clazzy.newInstance();
            newItem.load(obj);
            items.add(newItem);
        } catch (InstantiationException e) {
            // whatever
        } catch (IllegalAccessException e) {
            // whatever
        } catch (ClassNotFoundException e) {
            // whatever
        }
    }

언급URL : https://stackoverflow.com/questions/7539954/java-json-serialization-best-practice

반응형