LINUX.ORG.RU

Json туда и обратно

 ,


0

1

Привет! Есть у меня вот такой класс:

public class Node<T> implements Serializable {
    private final String name;
    private final T value;
    private final String type;

     public Node(String name, T value, String type) {
        this.name = name;
        this.value = value;
        this.type = type;
    }
}

Мне необходима возможность сериализовывать/дессериализовывать в JSON его. При этом T - может быть любой, в том числе и List<E>, Map<K, V> и и.д

Я сделал вот так:

public class NodeMarshaller {
    private final Gson gson;

    NodeMarshalle() {
        this.gson = new Gson();
    }

 
    public String serialize(Node<?> node) {
        return gson.toJson(node);
    }


    public Node<?> deserialize(String node) {
        try {
            Class<?> clazz = Class.forName(new JsonParser().parse(node).getAsJsonObject().get("type").getAsString());
            return gson.fromJson(node, getType(Node.class, clazz));
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    private Type getType(Class<?> rawClass, Class<?> parameter) {
        return new ParameterizedType() {
            @Override
            public Type[] getActualTypeArguments() {
                return new Type[]{parameter};
            }

            @Override
            public Type getRawType() {
                return rawClass;
            }

            @Override
            public Type getOwnerType() {
                return null;
            }
        };
    }
}
Это все работает при T = String, Integer, ArrayList, но вложенности мне не обеспечивает.

Я использую библиотеку GSON, но в принципе - не важно, могу перейти на любую.

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.