Подтвердить что ты не робот

Анализ JSON-объекта в Java

У меня есть объект JSON следующим образом:

member = "{interests : [{interestKey:Dogs}, {interestKey:Cats}]}";

В Java я хочу проанализировать вышеупомянутый jsonobject и сохранить значения в arraylist.

Может ли кто-нибудь предоставить мне некоторый фрагмент кода, через который я смогу достичь этого.

Спасибо

4b9b3361

Ответ 1

Я предполагаю, что вы хотите сохранить интерес в списке.

Используя библиотеку org.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"));
}

Ответ 2

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));
            }
        }
    }
}}

Ответ 3

Большое спасибо soooooooo к CODE Я могу прочитать любой файл 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);
            }
        }
    }
}

Ответ 4

В Java доступно много JSON-библиотек.

Самые известные из них: Джексон, GSON, Genson, FastJson и org.json.

Обычно для выбора любой библиотеки нужно искать три вещи:

  • Производительность
  • Простота использования (код прост в написании и разборчивости) - это относится к функциям.
  • Для мобильных приложений: зависимость/размер jar

В частности, для библиотек JSON (и любых сериализационных/десериализационных библиотек) также интересна привязка данных, поскольку она устраняет необходимость написания кода котельной пластины для упаковки/распаковки данных.

Для 1 см. этот тест: https://github.com/fabienrenaud/java-json-benchmark Я использовал JMH, который сравнивает (джексон, gson, genson, fastjson, org.json, jsonp) производительность сериализаторов и десериализаторов с использованием API потоков и данных. Для 2 вы можете найти множество примеров в Интернете. Вышеупомянутый эталон также может быть использован в качестве источника примеров...

Быстрый вынос теста: Джексон выполняет в 5-6 раз лучше, чем org.json, и более чем в два раза лучше, чем GSON.

В вашем конкретном примере следующий код расшифровывает ваш json с помощью jackson:

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);
    }
}

Сообщите мне, если у вас есть какие-либо вопросы.

Ответ 5

1.) Создайте arraylist соответствующего типа, в этом случае i.e String

2.) Создайте JSONObject, передавая строку в конструктор JSONObject в качестве входного

  • В качестве JSONObject обозначение представлено фигурными скобками i.e {}
  • Где в качестве обозначения JSONArray представлены квадратные скобки i.e []

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 и т.д., который просто вернет значение по умолчанию, если оно отсутствует, и даже попытается преобразовать значение в 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 

или Чтобы получить пустую строку i.e "", если ключ не найден, просто используйте

  String missingKeyValue = json_data.optString("status");
  // will return "" if no key found where "" is an empty string

Дополнительная ссылка на исследование