Создать массив Java из одного элемента JSONArray - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть JSON Array по этому адресу: https://gcc.azure -api.net / traffic / v1 / движение / сейчас

И оно принимает вид:

[
    {
        "type": "irrelevant",
        "lastUpdate": "irrelevant",
        "batchIdentifier": "irrelevant",
        "site": "Irrelevant",
        "timestamp": "irrelevant",
        "flow": 18,
        "concentration": "irrelevant",
        "id": "irrelevant",
        "_id": "irrelevant"
    },
    {
        "type": "irrelevant",
        "lastUpdate": "irrelevant",
        "batchIdentifier": "irrelevant",
        "site": "Irrelevant"
        "timestamp": "irrelevant",
        "flow": 26,
        "concentration": "irrelevant",
        "id": "irrelevant",
        "_id": "irrelevant"
    }
]

Мне нужно иметь возможность получить эти значения для переменной «поток» для каждого элемента этого массива и поместить его в массив целых чисел java.Мне нужно это, чтобы постоянно загружать JSON для работы в режиме реального времени, поэтому его необходимо анализировать по URL-адресу, но я действительно изо всех сил пытаюсь найти какой-либо работающий способ сделать это без простого сбоя моего приложения.

Ниже приведенМетод, который я использовал вместе, который просто не работает, это просто комбинация различных решений, которые сейчас работают для меня, любое объяснение было бы полезно, спасибо.

public static void main() {

    float[] flowArray = null;

    try {
        JSONArray json = new JSONArray(getText("https://gcc.azure-api.net / traffic / v1 / movement / now"));
        int len = json.length();

        //iterate loop
        for (int i = 0; i < len; i++) {
            JSONObject jsonObject = json.getJSONObject(i);
            String flow = jsonObject.getString("flow");

            float flowNum = Float.parseFloat(flow);
            flowArray[i] = flowNum;
        }

    } catch (Exception Ex) {
        Log.e(TAG, "unexpected exception");
    }
}

public String getText(String url) throws Exception {
    URL website = new URL("https://gcc.azure-api.net/traffic/v1/movement/now");
    URLConnection connection = website.openConnection();
    BufferedReader in = new BufferedReader(new
            InputStreamReader(connection.getInputStream(), "UTF8"));

    StringBuilder response = new StringBuilder();
    String inputLine;

    while ((inputLine = in.readLine()) != null)
        response.append(inputLine);

    in.close();

    return response.toString();
}

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Я бы не стал работать с примитивными массивами.Используйте реализацию более высокого уровня Collection<T>, такую ​​как List<T>.

final JSONArray jsonArray = new JSONArray(getText("..."));
final List<String> flows = new ArrayList(jsonArray.length());

for (int i = 0; i < jsonArray.length(); i++) {
   final JSONObject jsonObject = jsonArray.getJSONObject(i);
   final int flow = jsonObject.getInt("flow");
   flows.add(flow);
}

return flows;
0 голосов
/ 19 февраля 2019

Если вы можете использовать библиотеку JsonPath .Пример использования:

import com.jayway.jsonpath.JsonPath;

import java.net.URL;
import java.util.List;

public class JsonPathApp {
    public static void main(String[] args) throws Exception {
        URL url = new URL("https://gcc.azure-api.net/traffic/v1/movement/now");

        List<Integer> flows = JsonPath.parse(url).read("$[*].flow");
        System.out.println(flows);
    }
}

Над кодом напечатаны:

[13,35,0,18,4,9,11,0,18,18,0,0,0,13,14,0,5,4,4,9,22,18,22,4,0,22,0,45,13,9,31,28,4,2,9,0,0,0,9,9,13,10,14,9,0,13,18,31,33,0]

Но если вам действительно нужно использовать JSONArray, вы можете сделать это, как показано ниже:

List<Integer> flows = new ArrayList<>();
JSONArray objects = JSONArray.fromObject(json);
objects.iterator().forEachRemaining(o -> flows.add(((JSONObject) o).getInt("flow")));
System.out.println(flows)

Где json параметр String.JSON* классы приходят из net.sf.json.* пакета.

0 голосов
/ 19 февраля 2019

См. Рабочий пример ниже.Некоторые комментарии:

  1. Значение flow в JSON отсутствует в скобках.→ Это не строка, а число.Используйте .getInt(...) вместо .getString(...).
  2. Инициализируйте массив вместо нуля: float[] flowArray = null;int[] flowArray = new int[len];.
  3. Метод main(...) должен быть статическим, если вы используете его какточка входа для приложения.
    public static String getText(String url) throws Exception {
        URL website = new URL(url);
        URLConnection connection = website.openConnection();
        BufferedReader in = new BufferedReader( new 
                InputStreamReader(connection.getInputStream(),"UTF8"));
        StringBuilder response = new StringBuilder();
        String inputLine;
        while ((inputLine = in.readLine()) != null)
            response.append(inputLine);
        in.close();
        return response.toString();
    }

    public static void main(String[] args) {
        try {
            JSONArray json = new JSONArray(getText(
                    "https://gcc.azure-api.net/traffic/v1/movement/now"));
            int len = json.length();
            int[] flowArray = new int[len];
            //iterate loop
            for (int i = 0; i < len; i++) {
                JSONObject jsonObject = json.getJSONObject(i);
                flowArray[i] = jsonObject.getInt("flow"); 
            }
        } catch (Exception Ex) {
            Ex.printStackTrace();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...