Использование GSON для анализа объекта json vs json array

У меня есть JSON, который является либо единственным объектом, либо массивом одного и того же объекта. Есть ли способ проанализировать эти данные с помощью Gson, где он будет отличать один объект от массива?

Единственное решение, которое я имею в настоящее время для этого, - это вручную разобрать json и surround с помощью try catch. Сначала я попробую разобрать его как один объект, если он не удастся, он вызовет исключение, а затем попытаюсь проанализировать его как массив.

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

public class ObjectA implements Serializable{

    public String variable;
    public ObjectB[] objectb; //or ObjectB objectb;

    public ObjectA (){}
}

Здесь объект, который может быть либо массивом, либо единственным объектом.

public class ObjectB implements Serializable{

    public String variable1;
    public String variable2;

    public ObjectB (){}
}

И затем при взаимодействии с json-ответом. Я делаю это.

Gson gson = new Gson();
ObjectA[] objectList = gson.fromJson(response, ObjectA[].class);

Когда массив ObjectA сериализуется, json содержит либо массив, либо отдельный объект для ObjectB.

[
    {
        "variable": "blah blah",
        "objectb": {
            "variable1": "1",
            "variable2": "2"
        }
    },
    {
        "variable": "blah blah",
        "objectb": {
            "variable1": "1",
            "variable2": "2"
        }
    },
    {
        "variable": "blah blah",
        "objectb": [
            {
                "variable1": "1",
                "variable2": "2"
            },
            {
                "variable1": "1",
                "variable2": "2"
            }
        ]
    }
]

Ответ 1

Я только что изменил ObjectB[] на List<ObjectB> на объявление ObjectA.

ArrayList<ObjectA> la = new ArrayList<ObjectA>();
List<ObjectA> list = new Gson().fromJson(json, la.getClass());

for (Object a : list)
{
   System.out.println(a);
}

и это мой результат:

{variable=blah blah, objectb={variable1=1, variable2=2}}
{variable=blah blah, objectb={variable1=1, variable2=2}}
{variable=blah blah, objectb=[{variable1=1, variable2=2}, {variable1=1, variable2=2}]}

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

Ответ 2

Попробуйте использовать com.google.gson.JsonParser.

        String jsonString = "object json representation";
        JsonParser jsonParser = new JsonParser();
        JsonElement jsonElement = jsonParser.parse(jsonString);

        if (jsonElement.isJsonArray()) {
            // some logic
        }

Существуют разные способы получить ваш объект с помощью экземпляра JsonElement, например, просто используя методы com.google.gson.Gson:

public <T>  T fromJson(com.google.gson.JsonElement json, java.lang.Class<T> classOfT) throws com.google.gson.JsonSyntaxException 

public <T>  T fromJson(com.google.gson.JsonElement json, java.lang.reflect.Type typeOfT) throws com.google.gson.JsonSyntaxException

Итак, изучите классы JsonElement, JsonArray, JsonPrimitive, JsonNull и JsonObject. Поверьте, у них есть адекватный интерфейс для восстановления вашего объекта.

Ответ 3

Можете ли вы попробовать/уловить его, сначала попытавшись разобрать массив, а затем вернуться к разбору одного класса объекта?

Вы также можете сделать простой простой тест и посмотреть на первый символ без пробелов в строке, которую вы пытаетесь выполнить, если это "{", это единственный объект, если это "[", это массив