Можете ли вы при потоковой передаче файла Json с помощью GSON JsonReader вывести объект в строку? - PullRequest
1 голос
/ 06 мая 2020
• 1000 с помощью OOM, если я попытаюсь.

Поэтому я использую JsonReader для обработки потока JSON.

Бывают случаи, когда я достигаю BEGIN_OBJECT, когда я хочу просто выгрузить содержимое объекта в строку вместо обработки каждого отдельного элемента.

Например, я разбираю что-то вроде этого:

[ { "SchemaVersion":"15.0.0.0","LibraryVersion":"16.0.7324.1200","ErrorInfo":{ "ErrorMessage":"Access denied. You do not have permission to perform this action or access this resource.","ErrorValue":null,"TraceCorrelationId":"03ab459e-7076-5000-c1a7-196f1fc54384","ErrorCode":-2147024891,"ErrorTypeName":"System.UnauthorizedAccessException" },"TraceCorrelationId":"03ab459e-7076-5000-c1a7-196f1fc54384" } ]

Когда я добираюсь до ErrorInfo, я просто хотите, чтобы это была строка, а не разобранная. Я не хочу анализировать каждую часть.

Итак, вот код:

try (InputStream is = (InputStream)response.getEntity();
           InputStreamReader inputStreamReader = new InputStreamReader(is);
           JsonReader jsonReader = new JsonReader(inputStreamReader)) {
        if (jsonReader.peek() != JsonToken.BEGIN_ARRAY) {
          return;
        }
        jsonReader.beginArray();
        while (jsonReader.hasNext()) {
          jsonReader.beginObject(); // Start of the default object on every request

          jsonReader.skipValue(); // name SchemaVersion
          jsonReader.skipValue(); // value
          jsonReader.skipValue(); // name LibraryVersion
          jsonReader.skipValue(); // value
          jsonReader.skipValue(); // name ErrorInfo
          if (jsonReader.peek() == JsonToken.BEGIN_OBJECT) {
            // I want to dump the upcoming object to string here
...

Можно ли выгрузить содержимое читателя json для данного начала объект, пока он не закончится строкой?

Аналогичный вопрос, но не совсем тот же: Получить дамп раздела (объекта) JSON

1 Ответ

1 голос
/ 06 мая 2020

Отдельное спасибо { ссылка } за ответ в комментариях. Вы можете использовать Gson.fromJson(jsonReader, Map.class) для этой конкретной ситуации.

Gson gson = new Gson();
try (InputStream is = (InputStream)response.getEntity();
           InputStreamReader inputStreamReader = new InputStreamReader(is);
           JsonReader jsonReader = new JsonReader(inputStreamReader)) {
        if (jsonReader.peek() != JsonToken.BEGIN_ARRAY) {
          return;
        }
        jsonReader.beginArray();
        while (jsonReader.hasNext()) {
          Map header = gson.fromJson(jsonReader, Map.class);
          if (header.get("ErrorInfo") != null) {
            String errorDump = ((Map)header.get("ErrorInfo")).toString();
            // Now I have the error dump I need but I also 
            // didn't load the entire thing into memory!
...

подробнее: https://javadeveloperzone.com/java-8/java-parse-large-json-file-gson-example/

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