Проверьте объект JSON в Java
Я выбираю JSON, используя модификацию 2, которая несет объект, если ключ имеет значение, иначе пустой массив. например:
Если ключ т.е. адрес имеет значения, он возвращает объект
{
"student": {
"name": "Some name",
"address": {
"house": "5",
"road": "3"
}
}
}
Если ключ т.е. адрес не имеет никакого значения, он возвращает пустой массив
{
"student": {
"name": "Some name",
"address": []
}
}
В моем классе POJO я сделал тип класса Address объектом, чтобы модификация могла анализировать JSON.
public class Student {
@SerializedName("name")
@Expose
private String name;
@SerializedName("address")
@Expose
private Object address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Object getAddress() {
return address;
}
public void setAddress(Object address) {
this.address = address;
}
}
Теперь, как я могу проверить, что тип адреса - объект или массив?
Я попытался с isArray(), но не нашел результат.
if(obj.getclass().isArray())
Заранее спасибо.
4 ответа
Вы можете проверить через instanceof
это объект JosnObject
или же JsonArray
?
if (address instanceof JSONObject) {
JSONObject jsonObject = (JSONObject) address;
}
else if (address instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) address;
}
Интересно, почему твой json
не соответствует? Я имею в виду, что если в адресе нет значения, он не должен быть JSONArray
Вместо этого это должно быть похоже на -
"address": {
"house": "",
"road": ""
}
Это будет легко разобрать, если вы делаете, как указано выше - теперь вы Pojo
будет -
public class Address {
@SerializedName("house")
@Expose
private String house;
@SerializedName("road")
@Expose
private String road;
public String getHouse() {
return house;
}
public void setHouse(String house) {
this.house = house;
}
public String getRoad() {
return road;
}
public void setRoad(String road) {
this.road = road;
}
}
И, наконец, вы можете получить Address
с помощью -
@SerializedName("address")
@Expose
private Address address;
в вашем Student
учебный класс
PS,
Проблемы на стороне сервера должны быть исправлены на стороне сервера.
Спасибо всем. Я нашел свой ответ с помощью instanceof. Вместо того, чтобы напрямую проверять адрес obj, я должен преобразовать значение в тип Object, т.е.
Gson gson = new GsonBuilder().serializeNulls().setLenient().create();
String jsonStr = gson.toJson(obj.getAddress());
Object json = new JSONTokener(jsonStr).nextValue();
И тогда я могу проверить с JSONObject
if (json instanceof JSONObject) {
// Object
}else{
// Array
}
Вы можете перейти к проверке схемы json, где вам нужно будет определить все, что происходит при обновлении типа и формата json, а затем проверить ваш json, используя библиотеки Jackson 2.x и fge / json-schema-validator.
Ссылка на ссылку для более подробной информации.