Один общий подход, о котором я не упоминал здесь, заключается в том, чтобы запустить HTML через Tidy , который может быть настроен на выдачу гарантированного действительного XHTML. Затем вы можете использовать любую старую библиотеку XML.
Но к вашей конкретной проблеме вы должны взглянуть на этот проект: http://fivefilters.org/content-only/ - это модифицированная версия алгоритма Readability , который предназначен для извлечения только текстового содержимого (а не верхних и нижних колонтитулов) со страницы.
Выяснил проблему: это работает JacksonFactory().createJsonGenerator().searialize()
(я ожидал, что он сериализует сериализацию ObjectMapper
). Это код для JsonHttpContent.writeTo()
(из JsonHttpContent.java в google-http-java-client ):
public void writeTo(OutputStream out) throws IOException {
JsonGenerator generator = jsonFactory.createJsonGenerator(out, getCharset());
generator.serialize(data);
generator.flush();
}
Джексон JsonGenerator
ожидает ключевое значение (представляется в Java как Map
), что не очевидно из сигнатуры конструктора конструктора JsonHttpContent
: JsonHttpContent(JsonFactory, Object)
.
Итак, если вместо передачи GcmDownstreamDto
(как определено в вопрос, который будет работать с ObjectMapper
), я должен был сделать следующее:
Map<String, Object> map = new HashMap<>();
List<String> idList = Arrays.asList("ABC");
map.put("registration_ids", idList);
все работает так, как ожидалось, и выход:
{"registration_ids":["ABC"]}
Так что просто не забудьте передать конструктор JsonHttpContent(JsonFactory, Object)
a Map<String, Object>
в качестве второго параметра, и все будет работать так, как вы ожидали.
Вам необходимо аннотировать поля POJO с помощью @Key
:
import com.google.api.client.util.Key;
// ...
@Key private String to;
@Key private Object data;
@Key private List<String> registration_ids;
// ...