Как десериализовать JSON с GSON в соответствующие универсальные типы Java? - PullRequest
2 голосов
/ 03 ноября 2011

Я хочу десериализовать объект JSON (используя GSON, потому что я уже использую его для поиска объектов) в общую карту типа Map<String, Object>. Он должен создавать объекты типов, которые соответствуют соответствующим типам JSON, то есть этот объект JSON

{ 
    "docID" : "a12345",
    "relation" : ["1", "2", "3"],
    "title" : { "de" : "German Title",
                "en" : "English Title"}
}

следует десериализовать в Map<String, Object> с записями следующих типов:
(String, String), (String, List<String>), (String, Map<String, String>) .

Я пытался использовать следующий код:

class Dictionary_ extends HashMap<String, Object> {
    // nothing to do
};

private static final GsonBuilder GSON_BUILDER = new GsonBuilder();

public Map<String, Object> deserializeJsonString(String jsonString) {
    Dictionary_ d = new Dictionary();
    return GSON_BUILDER.create().fromJson(jsonString, d.getClass());
}

Но тогда получающиеся типы созданных Объектов будут следующими:
(String, Object), (String, Object), (String, Object) и я не могу привести эти объекты к соответствующим «реальным» типам, потому что я получаю исключения приведения класса.

Я не могу использовать POJO, поскольку данные, которые я получаю, не имеют предопределенной структуры с точки зрения членов класса.

Итак, как я могу десериализовать такие общие данные в соответствии с общими типами Java?

Обновление:
Я просто попытался реализовать это с помощью JSON Simple, и он очень легко работает из коробки с помощью следующего кода:

        Object ret = JSONValue.parse(jsonString);
        return (List<Map<String, Object>>) ret;

Почему с GSON не все так просто ???

1 Ответ

2 голосов
/ 12 ноября 2011

Структура, в которую JSON.simple был десериализован, представляла собой карту, в которой каждый ключ записи представляет собой строку, а каждое значение записи представляет собой простой тип данных или другую карту.

Десериализация такой структуры с помощью Gson, к сожалению, не так проста, как мне кажется, и занимает несколько десятков строк кода. Я опубликовал пример этого на http://programmerbruce.blogspot.com/2011/06/gson-v-jackson.html. (найдите фразу «Код Gson, чтобы превратить любой объект JSON в карту», ​​чтобы перейти непосредственно к соответствующему примеру.)

В этом посте также приведен пример использования Джексона для выполнения той же задачи всего одной строкой кода. (Я настоятельно рекомендую по возможности отказаться от Гсона в пользу Джексона.)

...