users@jersey.java.net

Re: [Jersey] Unmarshaling JAXB object from JSON

From: Paul Sandoz <Paul.Sandoz_at_Sun.COM>
Date: Wed, 01 Apr 2009 11:15:39 +0200

On Mar 31, 2009, at 6:46 PM, Farrukh Najmi wrote:

> Paul Sandoz wrote:
>>
>> On Mar 31, 2009, at 5:48 PM, Farrukh Najmi wrote:
>>
>>> Paul Sandoz wrote:
>>>>
>>>> On Mar 31, 2009, at 5:36 PM, Farrukh Najmi wrote:
>>>>
>>>>>
>>>>> Hi Paul,
>>>>>
>>>>> In an earlier email you had mentioned that jersey can unmarshal
>>>>> a JAXB object from a JSON object.
>>>>> My jersey client sends a POST message with JSON string as value
>>>>> for a form parameter. How can I
>>>>> take that JSON string and unmarshal it to a JAXB object. I would
>>>>> be grateful for some focused tip on
>>>>> how to do this unmarshalling manually. Thanks.
>>>>>
>>>>
>>>> What is the media type of the form "multipart/form-data" or
>>>> "application/x-www-form-urlencoded" ?
>>>>
>>>
>>> I am not sure as I am using a 3rd party toolkit. How can I get
>>> this info from debugging the jersey server side code?
>>>
>>
>> Add a logging filter:
>>
>> https://jersey.dev.java.net/source/browse/*checkout*/jersey/tags/jersey-1.0.2/api/jersey/com/sun/jersey/api/container/filter/LoggingFilter.html
>>
>
> LoggingFilter shows that mediatype is: application/x-www-form-
> urlencoded
>

OK.

Ideally you should be able to reuse JSONJAXBContext for marshalling
and unmarshalling JAXB beans to and from JSON, but unfortunately this
is not currently possible (plus there are some bound assumptions that
need to be cleaned up before such an API is cleanly exposed).

So as Marc suggests using Providers is currently the best way:

   String jsonString = ...

   Providers p = ...

   Class<MyJSONBean> c = ...

   MessageBodyReader<MyJSONBean> r = p.getMessageBodyReader(c, c, new
Annotation[],
       MediaType.APPLICATION_JSON_TYPE);

   MyJSONBean b = r.readFrom(c, c, new Annotation[],
       MediaType.APPLICATION_JSON_TYPE,
       new InBoundHeaders(),
       new ByteArrayInputStream(jsonString.getBytes());

Ugly i know :-( but until we clean up the JSON JAXB API to be reusable
that is the only solution.

Paul.