У меня довольно разнообразная структура JSONObject. Я использую json.simple для получения таких значений от объекта:
String val1 = ((LinkedHashMap<String, String>) response.get("key1")).get("inner_key1");
String val2 = ((LinkedHashMap<String, String>) response.get("key1")).get("inner_key2");
int index1 = (int) ((ArrayList) response.get("index_key1")).get(0);
int index2 = (int) ((ArrayList) response.get("index_key2")).get(0);
int index3 = (int) ((ArrayList) response.get("index_key3")).get(0);
Мне интересно, могу ли я использовать служебный метод, чтобы получить эти значения более универсальным способом? Кроме того, я бы тоже хотел избежать этого кастинга, есть ли для этого какое-то решение?
Можете ли вы хранить некоторую информацию о типе в json?
@YugSingh Именно так я использую свой JSONObject, как вы можете видеть в примере. Ключи всегда одни и те же, но значения, конечно, нет.
@Charles Нет, я не могу ничего сохранить в "ответе". Я получаю этот JSON с сервера.




Поскольку ключи в JSON всегда одинаковы, вы можете создать класс и указать ключи как переменные экземпляра. Теперь вы можете использовать Jackson library's Object Mapper для преобразования JSON string в JSON Object, как показано в приведенном ниже коде.
public class Vehicle{
private String brand = null;
private int doors = 0;
public String getBrand() { return this.brand; }
public void setBrand(String brand){ this.brand = brand;}
public int getDoors() { return this.doors; }
public void setDoors (int doors) { this.doors = doors; }
}
В качестве основной функции вы можете написать следующий код:
ObjectMapper objectMapper = new ObjectMapper();
String carJson =
"{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
try {
Vehicle vehicle= objectMapper.readValue(carJson, Vehicle.class);
System.out.println("car brand = " + vehicle.getBrand());
System.out.println("car doors = " + vehicle.getDoors());
} catch (IOException e) {
e.printStackTrace();
}
Кроме того, при использовании способа Object Mapper вам не нужно выполнять кастинг.
Подробнее об этом можно прочитать здесь.
Вы можете использовать библиотеку GSON, предоставленную Google, для сопоставления JSON с Java.
Пример,
public class Example {
private String val1;
private String val2;
private ArrayList<int> index_key1;
private ArrayList<int> index_key2;
private ArrayList<int> index_key3;
///
// Getter Methods
///
public String getVal1() { return val1; }
public String getVal2() { return val2; }
public int getIndex1() { return index_key1.get(0); }
public int getIndex2() { return index_key2.get(0); }
public int getIndex3() { return index_key3.get(0); }
}
потом
Example ex = new Gson().fromJson(response.toString(), Example .class);
После этого все будет в порядке. Также существует библиотека Jackson, которая предоставляет решение, аналогичное GSON.
Как вы используете свой JSONObject? Всегда ли вы используете одни и те же поля, даже если JSONObject имеет разную структуру?