it-swarm.com.ru

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

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

Единственное решение, которое у меня есть в настоящее время для этого, состоит в том, чтобы вручную проанализировать json и окружить его попыткой 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"
            }
        ]
    }
]
10
abounket

Я только что изменил 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 также может использовать для гибкого анализа.

8
giampaolo

Попробуйте использовать 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. Поверьте, у них есть адекватный интерфейс для восстановления вашего объекта. 

2
oleg.lukyrych

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

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

0
Selecsosi