Gson десериализует сложный объект с рекурсивными зависимостями

У меня есть несколько классов, которые содержат рекурсивную зависимость друг от друга, и я сериализую их в формат JSON с помощью Gson GraphAdapterBuilder, и он отлично работает. Теперь я хочу десериализовать их в одну и ту же структуру, но не могу понять, как это сделать.

Я сделал пример:

class ClassA{
    public int field;
    public ClassB parent;
    public ClassA(int f, ClassB p){
        field = f;
        parent = p;
    }
}

class ClassB{
    public Vector<ClassA> vector = new Vector<ClassA>();
}

...

ClassB b = new ClassB();        

ClassA a1 = new ClassA(1,b);
ClassA a2 = new ClassA(2,b);
ClassA a3 = new ClassA(3,b);

b.vector.add(a1);
b.vector.add(a2);
b.vector.add(a3);

//Serializing object b

GsonBuilder gsonBuilder = new GsonBuilder();

new GraphAdapterBuilder()
    .addType(ClassA.class)
    .addType(ClassB.class)
    .registerOn(gsonBuilder);

Gson gson = gsonBuilder.create();

String json = gson.toJson(b);

Результат дает мне то, что я хочу:

{"0x1":{"vector":["0x2","0x3","0x4"]},"0x2":{"field":1,"parent":"0x1"},"0x3":{"field":2,"parent":"0x1"},"0x4":{"field":3,"parent":"0x1"}}

Есть ли способ десериализовать эту строку json обратно в объект ClassB?


person lub0v    schedule 06.10.2013    source источник


Ответы (2)


Хорошо, я нашел решение. Это было очень просто. Просто пришлось использовать функцию fromJson вместо toJson с той же структурой GraphAdapterBuilder.

    ...
    GsonBuilder gsonBuilder = new GsonBuilder();
    new GraphAdapterBuilder()
            .addType(ClassA.class)
            .addType(ClassB.class)
            .registerOn(gsonBuilder);
    gson = gsonBuilder.create();
    СlassB B = gson.fromJson(json,ClassB.class);

    System.out.println("B " + B.vector);
    for(ClassA classA:B.vector){
        System.out.println(classA.field + "  " + classA.parent);
    }

Выход:

    B [ClassA@10178f2b, ClassA@7ab8584d, ClassA@5cad662c]
    1  ClassB@7c0f023c
    2  ClassB@7c0f023c
    3  ClassB@7c0f023c
person lub0v    schedule 06.10.2013

person    schedule
comment
Это совсем не то, что мне было нужно. Почему вы заменили исходные классы на классы с полями типа String? Проблема заключалась только в использовании классов с рекурсивными зависимостями. Решение, которое вы написали, мне не подходит. - person lub0v; 06.10.2013
comment
переписывание исходных классов не является оптимальным решением - person virsha; 10.06.2017