Выяснил проблему: это работает 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 map = new HashMap<>();
List idList = Arrays.asList("ABC");
map.put("registration_ids", idList);
все работает так, как ожидалось, и выход:
{"registration_ids":["ABC"]}
Так что просто не забудьте передать конструктор JsonHttpContent(JsonFactory, Object)
a Map
в качестве второго параметра, и все будет работать так, как вы ожидали.
Согласно стандарту 5.16 параграфа 2 первого пункта, «второй или третий операнд (но не оба) является бросающим выражением (15.1); результат имеет тип другого и является значением». Следовательно, условный оператор не заботится о типе throw-выражения, а просто использует другой тип.
Фактически, в параграфе 1 пункта 15.1 прямо говорится: «Выражение броска имеет тип void».
From [expr.cond.2] (условный оператор ?:
):
Если второй или третий операнд имеет тип (возможно с квалификацией cv) void, то lvalue-to -rvalue, стандартные преобразования массива в указатель и функции в указатель выполняются на втором и третьи операнды, и одно из следующих должно выполняться:
- Второй или третий операнд (но не оба) являются выражением throw; результат относится к типу другого и является значением R.
- И второй, и третий операнды имеют тип void; результат имеет тип void и является rvalue. [Примечание: это включает случай, когда оба операнда являются выражениями throw. - конец примечания]
Итак, с // 1
вы были в первом случае, с // 2
, вы нарушили «одно из следующих должно выполняться», поскольку в таком случае никто из них этого не делает.
«Выражение-бросок имеет тип void»
ISO14882, раздел 15