Ответ довольно прост, когда вы понимаете, что нет специального HandlerMethodReturnValueHandler
для нового API JSR 353. Вместо этого в этом случае RequestResponseBodyMethodProcessor
(для @ResponseBody
) использует MappingJackson2HttpMessageConverter
для сериализации возвращаемого значения вашего метода обработчика.
Внутренне, MappingJackson2HttpMessageConverter
использует ObjectMapper
. По умолчанию ObjectMapper
использует геттеры класса для сериализации объекта в JSON.
Предполагая, что вы используете Glassfish
«s реализации поставщика в JSR 353, эти классы org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl
, org.glassfish.json.JsonStringImpl
и org.glassfish.json.JsonNumberImpl
и javax.json.JsonValue$3
(анонимный класс для значения FALSE
).
Поскольку JsonObjectImpl
(ваш результат, то есть. Корень, объект) является Map
(специальный типа), ObjectMapper
упорядочивает запись карты в качестве элементов JSON ключ-значения пары, где ключ карты является ключом JSON, и значения карт является значением JSON. Для ключа он отлично работает, сериализуется как name
, age
и married
. Для значения используются классы, упомянутые выше, и их соответствующие геттеры. Например, org.glassfish.json.JsonStringImpl
реализован как
final class JsonStringImpl implements JsonString {
private final String value;
public JsonStringImpl(String value) {
this.value = value;
}
@Override
public String getString() {
return value;
}
@Override
public CharSequence getChars() {
return value;
}
@Override
public ValueType getValueType() {
return ValueType.STRING;
}
...
}
ObjectMapper
поэтому использует добытчик Java Bean для сериализации JsonStringImpl
объекта (то есть значение карты запись вцелом), а
{"chars":"Dade","string":"Dade","valueType":"STRING"}
То же самое относится и для других полеев ,
Если вы хотите правильно написать JSON, просто верните String
.
@RequestMapping("/test", produces="application/json")
@ResponseBody
public String test() {
JsonObject result = Json.createObjectBuilder()
.add("name", "Dade")
.add("age", 23)
.add("married", false)
.build();
return result.toString();
}
Или сделать свой собственный HandlerMethodReturnValueHandler
, немного сложнее, но более полезным.
Какой API это? –
@SotiriosDelimanolis по API, вы имеете в виду JsonObject? это JSR 353: Java API для обработки JSON.Вопрос также обновлен – dade