Проверьте объект 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.

Ссылка на ссылку для более подробной информации.

http://wilddiary.com/validate-json-against-schema-in-java/

Другие вопросы по тегам