Хотя код, который вы написали, верен, набор провайдеров (сериализации), поддерживаемых платформой хоста, не стандартизирован; возможно, вы используете тот, у которого ничего не зарегистрировано для JSONArray
-> JSON? Это, безусловно, выглядит так. Вот пример провайдера:
@Provider
public class JSONArraySerializer implements MessageBodyWriter<JSONArray> {
@Override
public boolean isWriteable(Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
// Applicability condition: writing JSONArray to application/json
if (JSONArray.class.isAssignableFrom(type))
return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE);
return false;
}
@Override
public long getSize(JSONArray array, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return -1; // Can't be bothered to calculate
}
@Override
public void writeTo(JSONArray array, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException,
WebApplicationException {
try {
// Strictly should say encoding here; don't know right value...
array.write(new OutputStreamWriter(entityStream));
} catch (JSONException e) {
throw new WebApplicationException(e);
}
}
}
В некоторых реализациях каркаса JAX-RS достаточно просто создать этот класс на вашем пути к классам. В других (особенно в Apache CXF, может быть, в других) вам также необходимо зарегистрировать его вручную (поскольку у вас могут быть разные стратегии сериализации для разных сервисов в одном и том же веб-приложении; я нашел это полезным, но я писал очень сложное веб-приложение).