Джексон десериализует смешанный массив - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть сложная строка json, которую я пытаюсь десериализовать. Вот упрощенный пример (данные, которые я анализирую, гораздо больше вложены, чем это):

{
  "content": [
    {
      "value": {
        "name": "name1",
        "subvalue": {
          "id": "id1"
        }
      }
    },
    {
      "reference": "mixed"
    },
    {
      "value": {
        "name": "name2",
        "subvalue": {
          "id": "id2"
        }
      }
    }
  ]
}

Я пытаюсь десериализовать его через собственный десериализатор, и он работает нормально, за исключением того, что он также заполняет массив с пустыми значениями («справочная» часть мне не нужна).

Вот мой класс данных:

@JsonDeserialize(using = ResultDeserializer.class)
class ResultInfo {
    public String name;
    public String id;
}

Мой пользовательский десериализатор:

class ResultDeserializer extends JsonDeserializer<ResultInfo> {
    @Override
    public ResultInfo deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
        ResultInfo resultInfo = null;
        ObjectCodec mapper = jsonParser.getCodec();
        JsonNode node = mapper.readTree(jsonParser);

        node = node.get("value");

        if (node != null) {
            resultInfo = new ResultInfo();
            resultInfo.name(node.get("name").toString());
            resultInfo.id(node.at("/subvalue/id").toString());
        }

        return resultInfo;
    }

}

Однако при заполнении массива с помощью пользовательского десериализатора я получаю нулевые значения в массиве:

final CollectionType collectionType =
                TypeFactory
                        .defaultInstance()
                        .constructCollectionType(ArrayList.class, ResultInfo.class);

ArrayList<ResultInfo> resultInfos = null;
try {
   ObjectReader reader = mapper.readerFor(collectionType);
   resultInfos = reader.readValue(rootNode);
} catch (Exception e) {
   Log.e(TAG, "Exception:" + e.getMessage());
}

Есть ли для десериализации эквивалент:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

У меня есть также попытался добавить @JsonInclude(Include.NON_NULL) в мой класс данных безуспешно.

1 Ответ

0 голосов
/ 29 февраля 2020

Пример json недействителен, должно быть что-то вроде этого

{
  "content": [
    {
      "value": {
        "name": "name1",
        "subvalue": {
          "id": "id1"
        }
      }
    },
    {
      "reference": "mixed"
    },
    {
      "value": {
        "name": "name2",
        "subvalue": {
          "id": "id2"
        }
      }
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...