2014-11-13 2 views
1

Я в ситуации, когда у меня есть конечная точка REST, которая принимает POST входящих сообщений JSON.Использование JERSEY и JACKSON для анализа запроса POST с неизвестной структурой

Дело в том, что я не думаю, что могу указать объект POJO, чтобы Джексон мог маршировать JSON в объект POJO. Причина этого в том, что я не контролирую, что приходит к этой конечной точке, и количество полей и типа может меняться со временем, поэтому определение POJO перед рукой кажется не вариантом.

Итак, я думаю, что вопрос ... могу ли я просто сказать Джексону, чтобы он не делал никакой сортировки и не дал строку ответа? Я могу разобраться с этим позже с JSONObject-JSONArray или Gson. Скажите, что я должен был бы метод, как это:

@POST 
@Path("/callback") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public Response facebookUpdate(String json) { 
    //Do something with the json response... 
} 

Если это не представляется возможным с Джерси-JAX ... любые другие альтернативы?

Спасибо! Alejandro

+0

Возможна. Однако, вместо того, чтобы обрабатывать это явно, я бы выполнил собственный класс параметров. Джерси не очень придирчив, вы можете просто иметь объект буквально любого класса, который предоставляет метод 'valueOf (String)', конструктор, принимающий 'String' как параметр или метод' fromString (String) '. Звучит как приятное место для инкапсуляции синтаксического анализа. – toniedzwiedz

+0

Хороший вопрос, я попробую, Том, спасибо кучу – AlejandroVK

ответ

1

Проще всего просто не вводить JSON в метод и использовать объект запроса вместо:

public Response facebookUpdate(@Context request) { 
    try(InputStream is=request.getEntityInputStream()) { 
     ... 
    } 
} 

Из запроса, то вы можете получить InputStream для запроса и разобрать его в зависимости от того, как вам нравится.

Для синтаксического анализа Я могу порекомендовать свою собственную библиотеку jsonj, которая была написана специально для поддержки открытых сценариев, подобных описанию, и использует джексон для десериализации в сильно настраиваемые реализации java.util.Map и java.util.List. Gson также очень солидный выбор.

Если вы хотите сделать это приложение широким, вы можете вместо этого написать свой собственный @Provider и сделать то же самое. Вот как я сейчас использую свою библиотеку.

+0

Спасибо Jilles, я посмотрю на вашу библиотеку. Это действительный ответ, поэтому он подходит для вас. В качестве побочного примечания я попытался передать простую String методу, и он тоже работает, поэтому я могу сделать синтаксический анализ непосредственно тоже ... на всякий случай, если в него будут работать другие :) – AlejandroVK

+0

да, я думаю, это зависит от того, какие типы поставщик jackson настроен для обработки. Тем не менее, не буферизация вещей, как строка, прежде чем вы их разбираете, всегда хороша. –

0

Если вы знаете о структуре данных в формате Json, то вы пытаетесь использовать JAXB, он отлично работает с этим. Вы можете создать простой аннотированный класс, и затем вы можете работать с объектами, а не с строками.

+0

Спасибо, но я думаю, что я четко указал в названии «неизвестная структура» – AlejandroVK

Смежные вопросы