Как получить размер массива из строки JSON? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть строка, которая выглядит так

 [
  {
    "Slot": 1,
    "Ping": 40,
    "Kills": 0,
    "Deaths": 0,
    "Score": 0,
    "Team": "Reb",
    "Name": "ascasdasd",
    "KeyHash": "",
    "IsBanned": false,
    "TotalVisits": 34,
    "GroupName": "",
    "RemoteAddressStr": "",
    "DatabaseId": 1412
  },
  {
    "Slot": 3,
    "Ping": 116,
    "Kills": 0,
    "Deaths": 0,
    "Score": 0,
    "Team": "Reb",
    "Name": "",
    "KeyHash": "",
    "IsBanned": false,
    "TotalVisits": 1,
    "GroupName": "",
    "RemoteAddressStr": "",
    "DatabaseId": 8226
  }
]

Как я могу узнать ее размер / длину? В этом случае это должно быть 2

Я не уверен, нужно ли сначала разобрать его на JSONObject / JSONArray? Я безуспешно пытался разобрать его с помощью библиотеки GSON.

Обновление

Оказывается, это было проще, чем я думал. Мне даже GSON не понадобился:

int sizeOfJSONArrayString = new JSONArray(jsonString).length();

Спасибо за помощь!

Ответы [ 4 ]

1 голос
/ 05 августа 2020

Не десериализуйте в «POJO» или Object[], как было предложено по крайней мере дважды:

  • это способ тратить кучу (зачем нужны объекты, если вам нужно только подсчитать количество верхних элементов массива?);
  • и это способ пожертвовать производительностью (десериализаторы в некоторой степени выполняют более сложную работу, чем «простые» парсеры).

Если вы застряли в Gson, это может быть реализовано в Gson следующим образом:

public static int getTopElementCount(final JsonReader jsonReader)
        throws IOException {
    jsonReader.beginArray();
    int length = 0;
    for ( ; jsonReader.hasNext(); length++ ) {
            jsonReader.skipValue();
    }
    jsonReader.endArray();
    return length;
}

И его можно использовать для строк , как это (несмотря на промежуточные JSON строки в целом являются плохой идеей из-за затрат на создание такой строки):

final int length = JsonUtils.getTopElementCount(new JsonReader(new StringReader(json)));

Или, если есть файл или сетевой поток ввода, тогда:

try ( final JsonReader jsonReader = new JsonReader(new InputStreamReader(new FileInputStream(...), StandardCharsets.UTF_8)) ) {
    final int length = JsonUtils.getTopElementCount(jsonReader);
}
1 голос
/ 05 августа 2020

Если вы просто хотите узнать длину массива JSON, вы можете проанализировать его с помощью любого парсера JSON, а затем посмотреть на объект результата. В этом случае синтаксический анализатор org. json подойдет.

В зависимости от точной природы JSON, может реализовать хакерское решение, которое (скажем) подсчитывает количество { символов или что-то более сложное с использованием регулярных выражений. Такой подход не рекомендуется. Проблема в том, что синтаксис JSON (в общем) слишком сложен, чтобы быть практичным и надежным. Вы можете столкнуться с крайними случаями; например, вложенный объект или символ { в строке JSON.

1 голос
/ 05 августа 2020

Нет необходимости в каком-либо POJO, если вам нужен только размер:

int length = new Gson().fromJson(JSON, Object[].class).length;

Вы также можете использовать List, но поскольку это общий тип c, вы получите жалобы на исходный тип и возможно, захотелось использовать токен типа, который делает использование массива более удобным.

1 голос
/ 05 августа 2020

Используя Gson, как вы предложили:

Gson gson = new Gson();
MyPojo[] myPojoArray = gson.fromJson(json, MyPojo[].class); 
System.out.println(myPojoArray.length); // prints 2

MyPojo - это класс, который представляет ваш json:

class MyPojo {
    @SerializedName("Slot")
    @Expose
    private Integer slot;
    @SerializedName("Ping")
    @Expose
    private Integer ping;
    // other properties
    // getters and setters
}

Чтобы создать Pojo из вашего JSON вас можете проверить это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...