Сравнение объектов с разными типами

467
04 февраля 2017, 08:31

Доброго времени суток. Хочу распарсить вот такой json-файл.

Сам код для этого дела:

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.apache.http.ParseException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.FileReader;
public class JSONtest {
    public static void main(String args[]) throws Exception {
        JSONtest jsonTest = new JSONtest();
        Object ads[] = jsonTest.getAd();
        Integer noneAds = 0;
        for (int i = 1; i <ads.length; i++) {
            if (ads[i].equals(noneAds)) {
                System.out.println("Bingo");
            }
        }
    }
    public Object[] getAd() throws Exception {
        BufferedReader bufferedReader = new BufferedReader(new FileReader("C:/TAP/src/main/resources/vk.json"));
        JsonParser parser = new JsonParser();
        Object [] ads = new Object[7];
        try {
            JsonObject jsonResp = (JsonObject) parser.parse(bufferedReader);
            JsonArray postsList = (JsonArray) jsonResp.get("response");
            JsonObject unicPost = null;
            JSONObject jsonObject;
            for (int i = 1; i < postsList.size(); i++) {
                unicPost = (JsonObject) postsList.get(i);
                ads[i] = unicPost.get("marked_as_ads");
                System.out.println("Ads from sub " + ads[i]);
            }
        } catch (ParseException e) {e.printStackTrace();}
        return ads;
    }
}

В main'e хочу сравнить полученные данные из метода getAds со значением 0 типа Integer, но так как они разного типа в результате получается false, там где должно быть true; Пытался скастовать, но всегда вылетала ClassCastException. Что можно сделать?

Answer 1

Вариант 1

Вы используете метод public JsonElement get(String memberName).

У вас все верно написано, но значения корректнее сохранять в JsonElement при начитке, а точнее в массив JsonElement[] То есть так:

JsonElement[] ads = new JsonElement[7];

Тогда начитка в цикле останется такой же как у вас. Далее, массив JsonElement[] json вы можете конвертировать методом JsonElement.getAsInt(). То есть так:

int variable = ads[i].getAsInt();

Вариант 2

Или сразу сохраняйте значения в массив int[] ads через метод .getAsInt(). То есть так:

...
ads[i] = unicPost.get("marked_as_ads").getAsInt();
...
Answer 2

Попробуйте воспользоваться методом:

int getInt (String name)

вместо:

Object get (String name)

То есть будет вот так:

ads[i] = unicPost.getInt("marked_as_ads");

Соответственно, придется поменять тип массива на int[].

Далее можно работать с примитивами и сравнить их оператором ==.

Answer 3

Зачем записывать в массив JSON данные, если можно их превратить в строку. Попробуйте так:

ads[i] = unicPost.get("marked_as_ads").getAsString();

Массив при этом объявите как String[].

А дальше уже, если нужно обязательно сравнить с Integer, то можете к строке применить Integer.parseInt(String s) и получить из строки число.

http://stackoverflow.com/questions/34120882/gson-jelement-getasstring-vs-jelement-tostring

Кстати, есть метод getAsInt(). Так что можно сразу получать число. Только в Вашем файле не все данные числовые. Строка в этом смысле как-то универсальнее.

https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/JsonElement.html

READ ALSO
Сохранение цен в логах

Сохранение цен в логах

Есть таблица товаров (Goods)У каждого товара есть цена

442
как занести ссылку?

как занести ссылку?

Как занести ссылку?!

469