Just FYI : http://jira.codehaus.org/browse/JETTISON-75

we're hoping another maintenance release will be done in time for CXF 2.3
may be. Once it's fixed at the jettison level, I'll deprecate this
'ignoreMixedContent' property (setter stay for a while though) and remove
the internal writer...

cheers, Sergey


Sergey Beryozkin wrote:
> 
> I have updated JSONProvider to optionally ignore extra white characters
> available in mixed content trees,
> using 'ignoreMixedContent' property. It should fix this issue for you and
> I reckon it can be generally useful for users dealing with complex
> schemas, it is still an optional feature though as in some cases the
> additional content may be needed.
> 
> In meantime, here's a workaround (provided you can't change the schema to
> not require 'mixedcontent').
> 
> Have a custom JSONProvider which extends the default one and overrides the
> method where JSON-aware XMLStreamWriter, on the trunk it's
> createStreamReader method, but in the CXF version you use it may be
> marshall(), check the tagged source please. Wrap the created writer in the
> writer which ignores the additional characters, please check
> IgnoreMixedContentWriter at
> 
> http://svn.apache.org/repos/asf/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONProvider.java
> 
> Hope it helps, Sergey 
> 
> 
> 
> Sergey Beryozkin-2 wrote:
>> 
>> I reproduced it now, most likely @XmlMixed is there, with @ XmlAnyElement
>> 
>> cheers, Sergey
>> 
>> ----- Original Message ----- 
>> From: "Sergey Beryozkin" <[email protected]>
>> To: <[email protected]>
>> Sent: Wednesday, July 22, 2009 12:56 PM
>> Subject: RE: bad json response
>> 
>> 
>>>
>>> Hi
>>>
>>> I can not reproduce it at the moment. I've created a test which reads
>>> exactly the same XML you posted like this :
>>>
>>> @Test
>>> public void test() {
>>>        InputStream is = getClass().getResourceAsStream("book.xml");
>>>        JAXBContext context = JAXBContext.newInstance(new
>>> Class[]{Component.class});
>>>        Unmarshaller um = context.createUnmarshaller();
>>>        JAXBElement jaxbEl = um.unmarshal(new StreamSource(is),
>>> Component.class);
>>>        Map<String, String> namespaceMap = new HashMap<String, String>();
>>>        namespaceMap.put("http://xmp.cisco.com/wap/schemas/ui/Component";,
>>> "");
>>>        namespaceMap.put("http://xmp.cisco.com/wap/schemas/ui/Tree";, "");
>>>
>>>        JSONProvider p = new JSONProvider();
>>>        p.setSerializeAsArray(true);
>>>        p.setNamespaceMap(namespaceMap);
>>>        ByteArrayOutputStream os = new ByteArrayOutputStream();
>>>
>>>        p.writeTo(jaxbEl, (Class)JAXBElement.class, JAXBElement.class,
>>> JAXBElement.class.getAnnotations(),
>>>                  MediaType.APPLICATION_JSON_TYPE, new
>>> MetadataMap<String,
>>> Object>(), os);
>>>        String s = os.toString();
>>>        System.out.println(s);
>>> }
>>>
>>> it outputs :
>>>
>>> {"component":{"@id":"Tree","properties":{"treeProperties":{"multiSelect":true,"doubleClickOpen":false,"singleClickOpen":false,"lazyLoad":false},"node":{"iconclass":"myIconClass"}}}}
>>>
>>> I created Component, Properties, TreeProperties and Node classes using
>>> the
>>> posted XML as the source so I might've missed some specifics but I think
>>> the
>>> problem is really to do with the fact that for some reasons
>>> ignorable whitespaces have been captured somehow during the initial read
>>> and
>>> they trick Jettison into outputting these BadgerFish notation like '$'
>>> symbols (thanks to dejan for explaining it to me).
>>>
>>> Can you please send me the actual XML file ? I created mine on Windows,
>>> so
>>> may be in your case it has some special characters or something. Also,
>>> is it
>>> how your read XML into JAXBElement ? I tried reading it into DOM first
>>> and
>>> using Unmarshaller.unmarshall(Node node, Class) too, no difference
>>>
>>> cheers, Sergey
>>>
>>>
>>>
>>> Sergey Beryozkin-2 wrote:
>>>>
>>>> Hi Vinh,
>>>>
>>>> Ok, it's a JAXBElement which is being returned...I'll try to reproduce
>>>> the problem,
>>>> cheers, Sergey
>>>>
>>>> -----Original Message-----
>>>> From: Vinh Nguyen (vinguye2) [mailto:[email protected]]
>>>> Sent: 21 July 2009 19:51
>>>> To: [email protected]
>>>> Subject: RE: bad json response
>>>>
>>>> Hi Sergey,
>>>>
>>>> Sorry for the late reply.  I'm using XSDs to define the object models,
>>>> generate the Java classes using standard JAXB, load data from XML
>>>> files,
>>>> and unmarshal to Java classes previously generated.
>>>>
>>>> The resource implementation looks like this:
>>>>
>>>> @Path("/metaregistry")
>>>> public class MetaRegistryService {
>>>>     @GET
>>>>     @Path("/{objectID}")
>>>>     @Produces({"application/json", "application/xml"})
>>>>     public JAXBElement getMetaObject(@PathParam("objectID") String
>>>> objectID)
>>>>     throws WebApplicationException {
>>>>         // Simply load the XML file with the given objectID, and
>>>> ummarshal to the JAXB class.
>>>>         JAXBElement xmlObj = ...;
>>>>         return xmlObj;
>>>>     }
>>>> }
>>>>
>>>> My beans.xml looks like this:
>>>>
>>>>     <jaxrs:server id="metaRegistryService" address="/">
>>>>         <jaxrs:serviceBeans>
>>>>             <ref bean="metaRegistryServiceBean" />
>>>>         </jaxrs:serviceBeans>
>>>>         <jaxrs:providers>
>>>>             <ref bean="jsonProviderBean" />
>>>>         </jaxrs:providers>
>>>>     </jaxrs:server>
>>>>     <bean id="metaRegistryServiceBean"
>>>> class="com.cisco.xmp.wap.core.service.metaregistry.MetaRegistryService"
>>>> />
>>>>     <util:map id="jsonNamespaceMap" map-class="java.util.Hashtable">
>>>>         <entry key="http://xmp.cisco.com/wap/schemas/ui/Component";
>>>> value="" />
>>>>         <entry key="http://xmp.cisco.com/wap/schemas/ui/Tree"; value=""
>>>> />
>>>>     </util:map>
>>>>     <util:list id="jsonTypes">
>>>>         <value>application/json</value>
>>>>         <value>application/jettison</value>
>>>>     </util:list>
>>>>     <bean id="jsonProviderBean"
>>>> class="org.apache.cxf.jaxrs.provider.JSONProvider">
>>>>         <property name="namespaceMap" ref="jsonNamespaceMap" />
>>>>         <property name="serializeAsArray" value="true" />
>>>>         <property name="consumeMediaTypes" ref="jsonTypes" />
>>>>         <property name="produceMediaTypes" ref="jsonTypes" />
>>>>     </bean>
>>>>
>>>> -Vinh
>>>>
>>>>
>>>> -----Original Message-----
>>>> From: Sergey Beryozkin [mailto:[email protected]]
>>>> Sent: Tuesday, July 21, 2009 9:12 AM
>>>> To: [email protected]
>>>> Subject: RE: bad json response
>>>>
>>>>
>>>> Can you please give me more info about this issue ?
>>>>
>>>> cheers, Sergey
>>>>
>>>> Sergey Beryozkin-2 wrote:
>>>>>
>>>>> Actually, you did say your data are in the XML file.
>>>>> So can you please post a sample resource class with a method showing
>>>>> how the data is being returned ?
>>>>>
>>>>> Just would like to see a bit better how JSONProvider does (eventually)
>>>>
>>>>> start working.
>>>>>
>>>>> Thanks, Sergey
>>>>>
>>>>> -----Original Message-----
>>>>> From: Sergey Beryozkin
>>>>> Sent: 19 July 2009 16:37
>>>>> To: '[email protected]'
>>>>> Subject: RE: bad json response
>>>>>
>>>>> Hi
>>>>>
>>>>> How does the Java class representing <component/> look like ?
>>>>> JSONProvider uses Jettison which is a STAX parser, so JAXB just
>>>>> streams the events and jettison reacts by converting them into JSON
>>>> sequences.
>>>>> Perhaps some JAXB annotation confuses Jettison...
>>>>>
>>>>> Thanks, Sergey
>>>>>
>>>>> -----Original Message-----
>>>>> From: Vinh Nguyen (vinguye2) [mailto:[email protected]]
>>>>> Sent: 18 July 2009 20:36
>>>>> To: [email protected]
>>>>> Subject: bad json response
>>>>>
>>>>> Hi,
>>>>> I've implemented a REST service.  I have data in an XML file, use
>>>>> standard JAXB, and configured
>>>>> org.apache.cxf.jaxrs.provider.JSONProvider
>>>>> in my beans.xml to convert the JAXB objects to JSON.
>>>>>
>>>>> But when I visually inspect the JSON response, there seems to be
>>>>> name-value entries appearing like "$":"\n        ".  Should these be
>>>>> there?  I assume the XML parser used by CXF should have already
>>>>> stripped out these unnecessary white spaces (i.e. carriage returns)
>>>>> before passing to the JSON converter.
>>>>>
>>>>> My XML looks like:
>>>>>
>>>>> <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <component
>>>>> xmlns="http://xmp.cisco.com/wap/schemas/ui/Component";
>>>>> xmlns:ns2="http://xmp.cisco.com/wap/schemas/ui/Tree"; id="Tree">
>>>>>     <properties>
>>>>>         <ns2:treeProperties>
>>>>>             <ns2:multiSelect>true</ns2:multiSelect>
>>>>>             <ns2:doubleClickOpen>false</ns2:doubleClickOpen>
>>>>>             <ns2:singleClickOpen>false</ns2:singleClickOpen>
>>>>>             <ns2:lazyLoad>false</ns2:lazyLoad>
>>>>>         </ns2:treeProperties>
>>>>>         <ns2:node>
>>>>>              <ns2:iconclass>myIconClass</ns2:iconclass>
>>>>>         </ns2:node>
>>>>>     </properties>
>>>>> </component>
>>>>>
>>>>> The JSON response is coming as:
>>>>>
>>>>>
>>>> {"component":{"@id":"Tree","properties":{"treeProperties":{"multiSelect"
>>>>>
>>>> :true,"doubleClickOpen":false,"singleClickOpen":false,"lazyLoad":false,"
>>>>> $":"\n        "},"node":{"iconclass":"myIconClass","$":"\t\t\t
>>>>> \n        "}}}}
>>>>>
>>>>> The $ property seems to appear after each corresponding element
>>>>> definition in the XML.  Any idea how to get rid of these "$"
>>>> properties?
>>>>> On the client side, I'm using Dojo JSONPATH utils, and it's failing to
>>>>
>>>>> process the JSON string.
>>>>>
>>>>> Thanks,
>>>>> -Vinh
>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>> View this message in context:
>>>> http://www.nabble.com/bad-json-response-tp24551156p24590780.html
>>>> Sent from the cxf-user mailing list archive at Nabble.com.
>>>>
>>>>
>>>>
>>>
>>> -- 
>>> View this message in context:
>>> http://www.nabble.com/bad-json-response-tp24551156p24604907.html
>>> Sent from the cxf-user mailing list archive at Nabble.com.
>>> 
>> 
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/bad-json-response-tp24551156p24624910.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to