Agreed, the json-xml serializer (jettison) is as solid, well supported and reportedly well written Stax parser (one of my team has been using it heavily). being stax its going to be good a streaming with low GC impact.

What is less clear (to me at least) at the moment, is how the beans get generated. We have a service API and so the Model impls eg PersonImpl objects are really just implementations of API that is mentioned in the service APIs. For the JSON -> Java serialization to work, the impl beans need to be instanced without mentioning the concrete implementations above the API.

Doing this with Guice is easy, as the Service (eg PersonService) implementation module will define what the concrete implementations of the model are, so of Xstream can use an injector to construct the request bean tree, then it only need to talk about interfaces. It looks like a generic GuiceConverter (implementing http:// xstream.codehaus.org/javadoc/com/thoughtworks/xstream/converters/ Converter.html) might be capable of performing this task.

So, I think both approaches are worth doing, and I have a feeling that Xstream perform better on a number of fronts.... but thats just a feeling.

Ian

On 26 Jun 2008, at 02:14, Robert Evans wrote:

We used XStream in a previous company for serializing very large amounts of
java call traces, and it worked very well.

Bob

On Wed, Jun 25, 2008 at 4:35 PM, Ian Boston <[EMAIL PROTECTED]> wrote:



Some comments also inline:


This bit looks like it works OOTB,

 public String convertToString(Object pojo) {
   JSONObject jsonObject = JSONObject.fromObject(pojo);
   return jsonObject.toString();
 }

and

I am still working on this, although I think that the jsonConfig or the
Guice module will need a bit more here.
The Impl's need to be bound to the interfaces in the injector, and there
might need to be a field translator in the config.

public <T> T convertToObject(String string, final Class<T> rootBeanClass) {
   JSONObject jsonObject = JSONObject.fromObject(string);
   JsonConfig jsonConfig = new JsonConfig();

 // enable Guice
jsonConfig.setNewBeanInstanceStrategy(new NewBeanInstanceStrategy(){



     @SuppressWarnings("unchecked")
     @Override
public Object newInstance(Class beanClass, JSONObject jsonObject)
         throws InstantiationException, IllegalAccessException,
         SecurityException, NoSuchMethodException,
InvocationTargetException {
       if ( beanClass == null ) {
         beanClass = rootBeanClass;
       }
       Object o =
 BeanJsonLibConverter.this.injector.getInstance(beanClass);
       return o;
     }

   });

// load the JSON
   T rootObject = injector.getInstance(rootBeanClass);
   Object o =  JSONObject.toBean(jsonObject,rootObject,jsonConfig);
   return (T) o;
 }

More comments inline:


On 26 Jun 2008, at 00:14, Louis Ryan wrote:

 Notes inlined....

On Wed, Jun 25, 2008 at 3:47 PM, Ian Boston <[EMAIL PROTECTED]> wrote:

 Ryan,
I have been looking at json-lib over the past few days, and have the java -> json serialization all working, and some of the json -> java
serialization working (as BeanJsonLibConverter) with the classes
coming from a guice injector (so that the calls can bind to interfaces
rather than concrete classes). I was also going to look at Xstream
because I had heard it was good.... comparitive evidence being better than guesswork.......but I will leave XStream if you are going to look
at it.



I guess the answer here will be whichever one we like best. Im hopeful
that
XStream will be a very small amount of code but I'Inm just starting. It
does
have the advantage of creating an idiomatic non-ATOM XML API that matches the JSON one basically for free if we want it. If you have a patch you
want
me to look at send it along.





One thing that this has lead me to realize is that whatever the
serialization mechanism is, we need to have some test cases that can validate as much of the API as possible without relying on hand coding
the test cases and risking transcription errors. I dont know if it
will work, but I am loading the opesocial-reference/features.xml into a Rhino context and extracting the json definition direct from the js
api. Hopefully this will mean that the wire protocol stays in step
with the js api definition, and the unit tests wont rely on
hand-recoding each time the API is revision(ed).

Is this a dumb idea ?



An interesting idea for sure but this may end up being tricky, how are you extracting the JSON format from the JS API as it isnt something which is
explicitly 'declared' in that code but rather just consumed.



2 approaches (experiments), but I am not certain if they will work.

I can drill into the attributes defining the JSON fields and validate that
the JSON has the required structure.

eg opensocial.Person.Fields contains the names of the JSON fields for
Person, it may need knowledge that person has fields containing other fields
eg addresses.

I am not expecting this to give a complete test, but it might validate some
of the structure of the message.

Or (if I can find the right place to do it) I can parse the JSON inside Rhino, and then look in via the API access methods that use the Fields... I remember seeing a generic getter somewhere at one point when scanning the
js.







and is completing a json-lib serializer a waste of effort ?

Ian (not wanting to duplicate effort unnecessarily)

2008/6/25 Louis Ryan <[EMAIL PROTECTED]>:

Ok now that Im back to working on the RESTful side of things I took a

look

at Pauls suggestion to use XStream as the serialization mechanism at

least

for JSON handling and I think it has a lot of merit. Im going to do some
prototyping in Shindig with this.

I've been catching up on the code since Im back from vacation so Ill

start

to make contributions in this area mostly focused on the JSON APIs

initially

as this seems to be where the most interest is and where the

implementation

path is clearest. My goal will be to have the Shindig JSON
implementation
working end-to-end in Orkut in large part to provide feedback on the API stack based on a working implementation (I hate working in a bubble!)


On Tue, Jun 10, 2008 at 3:11 PM, Paul Lindner <[EMAIL PROTECTED]> wrote:

It's not enunciate that provides the magic, it just uses xstream to do

the

dirty work:

http://xstream.codehaus.org/json-tutorial.html

You can either use jettison or your own driver.

For the jaxb mappings you can add something like this to the top of the
model classes:
@XmlRootElement(
          name = "person",
          namespace = "http://opensocial.org/2008/opensocial";
      )

And add

@XmlElement above each of the getters..

For enums you need something like this:
@XmlJavaTypeAdapter(Enum.DrinkerAdapter.class)

and a corresponding adapter.

sample here:



 http://www.hi5networks.com/platform/browser/shindig/trunk/java/
social-api/src/main/java/org/apache/shindig/social/opensocial/ model/Person.java




On Jun 10, 2008, at 2:57 PM, Cassie wrote:

Hmm.. I just worry that it would turn out like abdera... not providing

enough benefit for the learning curve. I mean, the restful json spec
is
really very simple, I'm hoping we can just whip it up :)

I could be convinced otherwise though - do you have any code you can

share

that uses enunciate?

- Cassie


On Tue, Jun 10, 2008 at 2:52 PM, Paul Lindner <[EMAIL PROTECTED]>

wrote:


If you're going down this route you might want to consider using JAXB

annotations and a custom json converter.

This type of situation is working quite well for us in the Enunicate toolkit and is already implemented there. In fact we've added JAXB annotations to our internal shindig repo and it's worked out really,
really
well.

As far as atom goes.. I have a set of classes that implement Atom in
JAXB
that I'd be happy to contribute.

Check out http://enunciate.codehaus.org/

Ryan, can you offer your thoughts?



On Jun 10, 2008, at 2:44 PM, Cassie wrote:

We tried to use abdera to implement the opensocial json restful
format

 within Shindig.. and it didn't work out very well. The code is

clunky,

overly complicated for simple json and is hard to come up to speed

on.


So... I am going to try an alternate implementation based on the
existing
older json wire format code. I was going to start coding something
in

a

separate dir so that none of the current code is disturbed.

Hopefully,

in
the next couple days we will have a cleaner impl of the restful json
that
is
90% the same as all of the current social code. (this means less
migration
for current social code users too, yea!)

And as for atom... well, we can figure that out later :)

Please let me know if you have any huge objections to this.
And of course, if it turns out to be worse than the abdera impl.. we

can

always go back.

- Cassie


 Paul Lindner
[EMAIL PROTECTED]





 Paul Lindner
[EMAIL PROTECTED]









Reply via email to