Использование 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
Можете ли вы попробовать/уловить его, сначала попытавшись разобрать массив, а затем вернуться к разбору одного класса объекта?
Вы также можете сделать простой простой тест и посмотреть на первый символ без пробелов в строке, которую вы пытаетесь выполнить, если это "{", это единственный объект, если это "[", это массив