cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "KARR, DAVID (ATTCINW)" <dk0...@att.com>
Subject RE: How to make clean json, instead of xml-ish json?
Date Fri, 02 Oct 2009 16:03:51 GMT
> -----Original Message-----
> From: Sergey Beryozkin [mailto:sberyozk@progress.com]
> 
> Note the reason "feature" is not dropped because you've add an
> @XmlWrapperElement, with  @XmlElement(name="features") alone you can
> get :
>
{"Item":{"features":[123,124],"description":"abc","id":1,"title":"item"
> }}
> 
> The question is how to tell Jettision that 'feature' needs to appear
as
> 'features' on the output and that a wrapper 'features' needs
> to be ignored. Expect some customizations to come in...

Note that an even better result would be

  {"id":"1","description":"def","title":"abc","features":["123","456"]}

This is the result I'm getting with the Jackson provider.  I'd be fine
with seeing if we can get the same with the Jettison provider, just so
people have an easy choice, at least for these capabilities.

(Curiously, if you're following my travails, I had the same annotations
classloader issue with the Jackson annotations that I did with the CXF
annotations, and putting the Jackson jars in APP-INF/lib resolved this.)

> ----- Original Message -----
> From: "KARR, DAVID (ATTCINW)" <dk068x@att.com>
> To: <users@cxf.apache.org>
> Sent: Thursday, October 01, 2009 9:51 PM
> Subject: RE: How to make clean json, instead of xml-ish json?
> 
> 
> > -----Original Message-----
> > From: Sergey Beryozkin [mailto:sberyozk@progress.com]
> >
> > Given this sample Item and Feature classes :
> >
> > @XmlRootElement
> >         public static class Item {
> >             private String description;
> >             @XmlElement
> >             public List<Feature> features = new
ArrayList<Feature>();
> >             private int id;
> >             private String title;
> >
> >             public void setDescription(String description) {
> >                 this.description = description;
> >             }
> >
> >             public String getDescription() {
> >                 return description;
> >             }
> >
> >             public void setId(int id) {
> >                 this.id = id;
> >             }
> >
> >             public int getId() {
> >                 return id;
> >             }
> >
> >             public void setTitle(String title) {
> >                 this.title = title;
> >             }
> >
> >             public String getTitle() {
> >                 return title;
> >             }
> >         }
> >
> >         @XmlRootElement
> >         public static class Feature {
> >             private int id;
> >
> >             public Feature() {
> >
> >             }
> >
> >             public Feature(int id) {
> >                 this.id = id;
> >             }
> >
> >             public void setId(int id) {
> >                 this.id = id;
> >             }
> >
> >             public int getId() {
> >                 return id;
> >             }
> >
> >         }
> >
> > The following test :
> >
> > @Test
> >     public void testIt2() throws Exception {
> >         JSONProvider p = new JSONProvider();
> >         p.setSerializeAsArray(true);
> >         List<String> keys = new ArrayList<String>();
> >         //keys.add("features");
> >         p.setArrayKeys(keys);
> >
> >         Item item = new Item();
> >         item.setDescription("def");
> >         item.features.add(new Feature(123));
> >         item.features.add(new Feature(124));
> >         item.setId(1);
> >         item.setTitle("abc");
> >
> >         ByteArrayOutputStream os = new ByteArrayOutputStream();
> >
> >         p.writeTo(item, (Class)Item.class, Item.class,
> > Item.class.getAnnotations(),
> >                   MediaType.APPLICATION_JSON_TYPE, new
> > MetadataMap<String, Object>(), os);
> >
> >         String str = os.toString();
> >         System.out.println(str);
> >     }
> >
> > produces :
> >
> >
>
{"item":{"features":[{"id":123},{"id":124}],"description":"def","id":1,
> > "
> > title":"abc"}}
> >
> > (one can probably affect the ordering with JAXB annotations too so
> that
> > "description" is listed first)
> >
> > Can you please send me the source for Item and Feature classes ?
> 
> I assume your example here is using the default Jettison provider,
> then?
> 
> In my current example, "features" is just a list of Strings, but an
> example of a list of non-primitives is also worth exploring.
> 
> I believe what you're saying in this example is that I need to set
> "serializeAsArray" to true, but leave "arrayKeys" as an empty list
> (which makes me wonder what that property actually does).
> 
> For reference, here is my current Item class:
> 
> @XmlRootElement(name = "Item")
> public class Item {
>   private String id;
>   private String title;
>   private String description;
>   private List<String> features = new ArrayList<String>();
> 
>   // This combination produces
> "<features><feature>val</feature></features>".
>   @XmlElementWrapper(name = "features")
>   @XmlElement(name = "feature")
>   public List<String> getFeatures() { return features; }
> }
> 
> > In meantime, please see how Jackson provider can be registered :
> >
>
http://svn.apache.org/repos/asf/cxf/trunk/systests/jaxrs/src/test/resou
> > r
> > ces/jaxrs_jackson_provider/WEB-INF/beans.xml
> >
> > Will it produce JSON you expect ?
> 
> We'll see.  If I still have issues with using Jettison, I'll try to
> move
> forward with using Jackson.
> 
> Thanks for your help.
> 
> > -----Original Message-----
> > From: KARR, DAVID (ATTCINW) [mailto:dk068x@att.com]
> > Sent: 01 October 2009 18:13
> > To: users@cxf.apache.org
> > Subject: RE: How to make clean json, instead of xml-ish json?
> >
> > > -----Original Message-----
> > > From: Sergey Beryozkin [mailto:sberyozk@progress.com]
> > > Sent: Thursday, October 01, 2009 9:42 AM
> > > To: users@cxf.apache.org
> > > Subject: Re: How to make clean json, instead of xml-ish json?
> > >
> > > Hi David
> > >
> > > sorry for a late reply, I was planning to reply later this
evening.
> > > Setting a 'features' key should've made a difference but I will
try
> > > your example just a bit later
> > > I'll get back to you asap
> > >
> > > Apparently a Jackson provider shoud do easily enough.
> >
> > Thanks.  I'll start diving into the Jackson documentation.
> >
> > > ----- Original Message -----
> > > From: "KARR, DAVID (ATTCINW)" <dk068x@att.com>
> > > To: <users@cxf.apache.org>
> > > Sent: Thursday, October 01, 2009 5:35 PM
> > > Subject: RE: How to make clean json, instead of xml-ish json?
> > >
> > >
> > > > -----Original Message-----
> > > > From: KARR, DAVID (ATTCINW)
> > > > Sent: Thursday, October 01, 2009 9:28 AM
> > > > To: users@cxf.apache.org
> > > > Subject: RE: How to make clean json, instead of xml-ish json?
> > > >
> > > > > -----Original Message-----
> > > > > From: KARR, DAVID (ATTCINW)
> > > > >
> > > > > I have a REST prototype using CXF that produces reasonable
> > looking
> > > > XML,
> > > > > and almost reasonably looking JSON.  The JSON it produces is
> > > > "xml-ish".
> > > > >
> > > > > For instance, the sample XML I get is the following:
> > > > >
> > > > > <Item>
> > > > >  <description>def</description>
> > > > >  <features>
> > > > >   <feature>123</feature>
> > > > >   <feature>456</feature>
> > > > >  </features>
> > > > >  <id>1</id>
> > > > >  <title>abc</title>
> > > > > </Item>
> > > > >
> > > > > The JSON is this:
> > > > >
> > > > >
> > > >
> > >
> >
>
{"Item":{"description":"def","features":{"feature":[123,456]},"id":1,"t
> > > > > i
> > > > > tle":"abc"}}
> > > > >
> > > > > A nicer JSON result would have been this:
> > > > >
> > > > >
> > > >
> > >
> >
>
{"Item":{"description":"def","features":[123,456],"id":1,"title":"abc"}
> > > > > }
> > > > >
> > > > > Is it possible to modify just the JSON results, but still have
> > the
> > > > "out
> > > > > of the box" XML results?
> > > >
> > > > Related to this, I noticed the "Dealing with JSON array
> > serialization
> > > > issues" section in the user guide.  I have a feeling this is
> > telling
> > > me
> > > > that setting "serializeAsArray" and "arrayKeys" in my
> JSONProvider.
> > > > I'm
> > > > building a test for this now.  Even if this works, I'd have to
> say
> > > that
> > > > this documentation could use a clearer explanation of this,
> perhaps
> > > > with
> > > > more fully-elaborated examples.  The documentation for this is
> > quite
> > > > brief.  Full examples showing "before" and "after" would be
> useful.
> > > > There is a link to another example that supposedly provides more
> > > info,
> > > > but it only shows the beans.xml file, without any elaboration or
> > > > example.
> > >
> > > My change to "serializeAsArray" and "arrayKeys" in a JSONProvider
> > > didn't
> > > do anything. The JSON output didn't change.
> > >
> > > The following are the relevant pieces of my beans.xml file:
> > >
> > > <?xml version="1.0" encoding="UTF-8"?>
> > > <beans xmlns="http://www.springframework.org/schema/beans"
> > >        xmlns:util="http://www.springframework.org/schema/util"
> > >    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> > >    xmlns:jaxws="http://cxf.apache.org/jaxws"
> > >         xmlns:jaxrs="http://cxf.apache.org/jaxrs"
> > >         xmlns:cxf="http://cxf.apache.org/core"
> > >     xsi:schemaLocation="
> > > http://www.springframework.org/schema/beans
> > > http://www.springframework.org/schema/beans/spring-beans.xsd
> > > http://www.springframework.org/schema/util
> > > http://www.springframework.org/schema/util/spring-util-2.0.xsd
> > > http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
> > > http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd
> > > http://cxf.apache.org/core http://cxf.apache.org/schemascore.xsd">
> > >
> > > <import resource="classpath:META-INF/cxf/cxf.xml" />
> > > <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"
> > > />
> > > <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
> > >     <import
> > > resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"
> />
> > >
> > >     <jaxrs:server name="restcatalogserver" address="/rest">
> > >         <jaxrs:features>
> > >             <cxf:logging/>
> > >         </jaxrs:features>
> > >         <jaxrs:providers>
> > >             <ref bean="jsonProvider"/>
> > >         </jaxrs:providers>
> > >
> > >         <jaxrs:serviceBeans>
> > >             <ref bean="catalog"/>
> > >         </jaxrs:serviceBeans>
> > >     </jaxrs:server>
> > >
> > >     <bean id="jsonProvider"
> > > class="org.apache.cxf.jaxrs.provider.JSONProvider">
> > >         <property name="serializeAsArray" value="true"/>
> > >         <property name="arrayKeys">
> > >             <list>
> > >                 <value>features</value>
> > >             </list>
> > >         </property>
> > >     </bean>
> > >     <bean id="catalog" class="com.att.ecom.catalog.Catalog">
> > >     </bean>
> > > </beans>


Mime
View raw message