Разбор объекта JSON в Java [дубликат]
этот вопрос уже есть ответ здесь:
- Как разобрать JSON на Java 30 ответов
У меня есть объект JSON следующим образом:
member = "{interests : [{interestKey:Dogs}, {interestKey:Cats}]}";
в Java я хочу разобрать выше jsonobject и хранить значения в arraylist.
может ли один прошу предоставить мне фрагмент кода, с помощью которого я могу достичь этот.
спасибо
5 ответов:
Я предполагаю, что вы хотите сохранить interestKeys в списке.
С помощью орг.json библиотека:
JSONObject obj = new JSONObject("{interests : [{interestKey:Dogs}, {interestKey:Cats}]}"); List<String> list = new ArrayList<String>(); JSONArray array = obj.getJSONArray("interests"); for(int i = 0 ; i < array.length() ; i++){ list.add(array.getJSONObject(i).getString("interestKey")); }
public class JsonParsing { public static Properties properties = null; public static JSONObject jsonObject = null; static { properties = new Properties(); } public static void main(String[] args) { try { JSONParser jsonParser = new JSONParser(); File file = new File("src/main/java/read.json"); Object object = jsonParser.parse(new FileReader(file)); jsonObject = (JSONObject) object; parseJson(jsonObject); } catch (Exception ex) { ex.printStackTrace(); } } public static void getArray(Object object2) throws ParseException { JSONArray jsonArr = (JSONArray) object2; for (int k = 0; k < jsonArr.size(); k++) { if (jsonArr.get(k) instanceof JSONObject) { parseJson((JSONObject) jsonArr.get(k)); } else { System.out.println(jsonArr.get(k)); } } } public static void parseJson(JSONObject jsonObject) throws ParseException { Set<Object> set = jsonObject.keySet(); Iterator<Object> iterator = set.iterator(); while (iterator.hasNext()) { Object obj = iterator.next(); if (jsonObject.get(obj) instanceof JSONArray) { System.out.println(obj.toString()); getArray(jsonObject.get(obj)); } else { if (jsonObject.get(obj) instanceof JSONObject) { parseJson((JSONObject) jsonObject.get(obj)); } else { System.out.println(obj.toString() + "\t" + jsonObject.get(obj)); } } } }}
спасибо оооооооо много кода Я могу прочитать любой файл JSON благодаря вашему коду :) Теперь я пытаюсь организовать все элементы по уровням, ибо мог бы их использовать!
Я работал с Android, читая JSON из URL, и единственное, что мне нужно было изменить, это строки
Set<Object> set = jsonObject.keySet(); Iterator<Object> iterator = set.iterator();
на
Iterator<?> iterator = jsonObject.keys();
я делюсь своей реализацией, чтобы помочь кому-то:
public void parseJson(JSONObject jsonObject) throws ParseException, JSONException { Iterator<?> iterator = jsonObject.keys(); while (iterator.hasNext()) { String obj = iterator.next().toString(); if (jsonObject.get(obj) instanceof JSONArray) { //Toast.makeText(MainActivity.this, "Objeto: JSONArray", Toast.LENGTH_SHORT).show(); //System.out.println(obj.toString()); TextView txtView = new TextView(this); txtView.setText(obj.toString()); layoutIzq.addView(txtView); getArray(jsonObject.get(obj)); } else { if (jsonObject.get(obj) instanceof JSONObject) { //Toast.makeText(MainActivity.this, "Objeto: JSONObject", Toast.LENGTH_SHORT).show(); parseJson((JSONObject) jsonObject.get(obj)); } else { //Toast.makeText(MainActivity.this, "Objeto: Value", Toast.LENGTH_SHORT).show(); //System.out.println(obj.toString() + "\t"+ jsonObject.get(obj)); TextView txtView = new TextView(this); txtView.setText(obj.toString() + "\t"+ jsonObject.get(obj)); layoutIzq.addView(txtView); } } } }
в Java доступно множество библиотек JSON.
самые известные из них: Джексон, GSON, Genson, FastJson и org.формат JSON.
обычно есть три вещи, на которые следует обратить внимание при выборе любой библиотеки:
- производительность
- простота использования (код прост в написании и разборчив) - это идет с функциями.
- для мобильных приложений: зависимость / размер банки
специально для библиотек JSON (и любых serialization / deserialization libs), привязка данных также обычно представляет интерес, поскольку она устраняет необходимость написания кода котельной плиты для упаковки/распаковки данных.
для 1 см. Этот тест:https://github.com/fabienrenaud/java-json-benchmark я использовал JMH который сравнивает (jackson, gson, genson, fastjson, org.JSON, jsonp) производительность сериализаторов и десериализаторов с использованием API stream и databind. Для 2, Вы можете найти многочисленные примеры Интернет. Выше тест также может быть использован в качестве источника примеров...
быстрый вынос бенчмарка:Джексон выполняет от 5 до 6 раз лучше, чем орг.json и более чем в два раза лучше, чем GSON.
для вашего конкретного примера, следующий код декодирует ваш json с Джексоном:
public class MyObj { private List<Interest> interests; static final class Interest { private String interestKey; } private static final ObjectMapper MAPPER = new ObjectMapper(); public static void main(String[] args) throws IOException { MyObj o = JACKSON.readValue("{\"interests\": [{\"interestKey\": \"Dogs\"}, {\"interestKey\": \"Cats\" }]}", MyObj.class); } }
Дайте мне знать, если у вас есть какие-либо вопросы.
1.) Создайте arraylist соответствующего типа, в этом случае т. е.
String
2.) Создать
JSONObject
при передаче строки вJSONObject
конструктор в качестве входных данных
- как
JSONObject
обозначение представлено фигурными скобками, т. е.{}
- где
JSONArray
обозначение представлено квадратными скобками, т. е.[]
3.) Получить
JSONArray
СJSONObject
(создается на 2-м шаге) используя"interests"
в качестве индекса.4.) Траверс
JASONArray
используя петли до длины массива, предоставленногоlength()
функции5.) Получить ваш
JSONObjects
СJSONArray
используяgetJSONObject(index)
функции6.) Извлеките данные из
JSONObject
С помощью индекса "interestKey".Примечание :
JSON
синтаксический анализ использует escape-последовательность для специальных вложенных символов, если ответ json (обычно из других API ответа JSON) содержит кавычки ("
) такой`"{"key":"value"}"`
должно быть так
`"{\"key\":\"value\"}"`
так что вы можете использовать
JSONParser
для достижения экранированного формата последовательности для безопасности какJSONParser parser = new JSONParser(); JSONObject json = (JSONObject) parser.parse(inputString);
код :
JSONParser parser = new JSONParser(); String response = "{interests : [{interestKey:Dogs}, {interestKey:Cats}]}"; JSONObject jsonObj = (JSONObject) parser.parse(response);
или
JSONObject jsonObj = new JSONObject("{interests : [{interestKey:Dogs}, {interestKey:Cats}]}");
List<String> interestList = new ArrayList<String>(); JSONArray jsonArray = jsonObj.getJSONArray("interests"); for(int i = 0 ; i < jsonArray.length() ; i++){ interestList.add(jsonArray.getJSONObject(i).optString("interestKey")); }
Примечание : иногда вы можете увидеть некоторые исключения, когда
values are not available in appropriate type or is there is no mapping key
поэтому в тех случаях, когда вы не уверены в присутствии ценности так что используйтеoptString
,optInt
,optBoolean
etc, который просто вернет значение по умолчанию, если его нет, и даже попытается преобразовать значение в int, если оно имеет строковый тип и наоборот так просто никаких исключений null или NumberFormat вообще в случае отсутствия ключа или значенияполучите дополнительную строку, связанную с ключом. Он возвращает defaultValue, если такого нет ключ.
public String optString(String key, String defaultValue) {
String missingKeyValue = json_data.optString("status","N/A"); // note there is no such key as "status" in response // will return "N/A" if no key found
или получить пустую строку, т. е.
""
если ключ не найден, то просто используйтеString missingKeyValue = json_data.optString("status"); // will return "" if no key found where "" is an empty string
далее ссылка на исследование