GSON может быть массивом строк или массивом объектов - PullRequest
1 голос
/ 06 мая 2019

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

В соответствии со спецификациями API options может быть списком значений: ["one", "two"]ИЛИ

может быть списком пар {"значение": "Метка"} для предоставления меток для значений

{
...
  "options": ["one", "two", "three"],
}

ИЛИ

{
...
  "options": [{"light": "Solarized light"}, {"dark": "Solarized dark"}],
}

1 Ответ

2 голосов
/ 07 мая 2019

Вы можете сопоставить это поле с Map<String, String>:

class Pojo {

    @JsonAdapter(OptionsJsonDeserializer.class)
    private Map<String, String> options;

    // getters, setters, toString, other properties
}

Список примитивов означает, что у вас есть только значения (без меток).В случае списка JSON Object s у вас есть значения с метками.Теперь вам нужно реализовать пользовательский десериализатор для данного свойства:

class OptionsJsonDeserializer implements JsonDeserializer<Map<String, String>> {

    @Override
    public Map<String, String> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        if (json.isJsonArray()) {
            Map<String, String> map = new HashMap<>();
            JsonArray array = json.getAsJsonArray();
            array.forEach(item -> {
                if (item.isJsonPrimitive()) {
                    map.put(item.getAsString(), null);
                } else if (item.isJsonObject()) {
                    item.getAsJsonObject().entrySet().forEach(entry -> {
                        map.put(entry.getKey(), entry.getValue().getAsString());
                    });
                }
            });

            return map;
        }

        return Collections.emptyMap();
    }
}

Простое использование:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.annotations.JsonAdapter;

import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class GsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        Gson gson = new GsonBuilder().create();

        Pojo pojo = gson.fromJson(new FileReader(jsonFile), Pojo.class);
        System.out.println(pojo);
    }
}

Для JSON object s:

{
  "options": [
    {
      "light": "Solarized light"
    },
    {
      "dark": "Solarized dark"
    }
  ]
}

печать:

Pojo{options={light=Solarized light, dark=Solarized dark}}

Для списка примитивов:

{
  "options": [
    "one",
    "two",
    "three"
  ]
}

Отпечатки:

Pojo{options={one=null, two=null, three=null}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...