GSON рекурсивно декодирует ключи карты - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу использовать GSON для декодирования массива карт, в которых ключи не являются строками.Я знаю, что тип JSON не позволяет использовать объекты в качестве ключей, поэтому я надеялся, что GSON сможет рекурсивно работать для декодирования строк.

Java

public class Reader {
    static class Key {
        int a;
        int b;
    }
    static class Data {
        HashMap<Key, Integer> map;
    }


    public static void read() {
        Gson gson = new Gson();
        String x = "[{\"map\": { \"{\\\"a\\\": 0, \\\"b\\\": 0}\": 1 }}]";
        Data[] y = gson.fromJson(x, Data[].class);
    }
}

Пример JSON

[
    {
        "map": {
            "{\"a\": 0, \"b\": 0}": 1
        }
    }
]

Здесь я хотел бы добиться, чтобы строка "{\"a\": 0, \"b\": 0}" декодировалась GSON в объект типа Key соба элемента установлены в 0. Затем этот объект может использоваться для заполнения HashMap класса Data.

Возможно ли это достичь?

1 Ответ

0 голосов
/ 27 сентября 2018

Вы можете достичь этого с помощью пользовательского JsonDeserializer.С помощью специального десериализатора вы можете решить, как десериализовать этот класс Key.Реализуйте его где-нибудь, пример ниже:

public JsonDeserializer<Key> keyDs = new JsonDeserializer<Key>() {
    private final Gson gson = new Gson(); 
    @Override
    public Key deserialize(JsonElement json, Type typeOfT,
                               JsonDeserializationContext context)
            throws JsonParseException {
        // This will be valid JSON
        String keyJson = json.getAsString();
        // use another Gson to parse it, 
        // otherwise you will have infinite recursion
        Key key = gson.fromJson(keyJson, Key.class);
        return key;
    }
};

Зарегистрируйте его с помощью GsonBuilder, создайте Gson и десериализуйте:

Data[] mapPojos = new GsonBuilder().registerTypeAdapter(Key.class, ds).create()
            .fromJson(x, Data[].class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...