Hi Lynn,
Walton, Lynn wrote:
> Hello all,
>
> I'm hoping to use XStream with the JettisonMappedXmlDriver to deserialize
> some 3rd party json output.
>
> The json output includes numbers as object names so in my example below
> propertyC actually has 3 nested objects but uses a number "1", "2", or "3"
> as the object name. In my real world the json usually contains between
> 100 and 200 of these (it varies).
>
> For instance:
>
> { "root" : { "propertyA " : "valueA",
> "propertyB" : "valueB",
> "propertyC" : { "1" : { "propertyC1" : "propertyC1_1_Value",
> "propertyC2" : "propertyC2_1_Value",
> "propertyC3" : "propertyC3_1_Value"
> },
> "2" : { "propertyC1" : "propertyC1_2_Value",
> "propertyC2" : "propertyC2_2_Value",
> "propertyC3" : "propertyC3_2_Value"
> },
> "3" : { "propertyC1" : "propertyC1_3_Value",
> "propertyC2" : "propertyC2_3_Value",
> "propertyC3" : "propertyC3_3_Value"
> }
> },
> "propertyD" : "valueD"
> } }
>
> Can someone point me in the direction of what I'd have to do to make this
> work so that I could have the json deserialized into Java objects. I
> thought I'd have the Root object with it's simple properties/fields for
> propertyA, propertyB, and propertyD and a collection of propertyC but then
> I don't know how to configure a converter and/or aliases to handle the
> "1", "2","3" , etc all as the same object. I'd like to build 3 objects of
> the same type and where it has an extra property that really represents
> the object name (the 1, 2 or 3, etc).
>
> Are there some advance aliasing, converter and/or other tricks I could
> use to make this reasonable with xstream and jettison or should I look
> into other json converting utilities? I don't want to "preprocess" the
> json string to change its format.
first let me state that it is already an annoying process to write
converters to match an incoming XML, it is even more so for JSON, especially
since this conversion is even more limited due to some heuristics the
Jettison parser has to make. Therefore as first recommendation: Try to write
this JSON format using XStream, then you have a much better chance that it
can be read. And it is much easier to tweak the output if it does not match
the required format instead of not knowing why half of the information got
lost at deserialization ;-)
Additionally you have to understand how XStream/JSON works in this case.
Jettison is a backend for the StAX API i.e. XStream does not really know
that it produces JSON, this is completely hidden by the Jettison
writer/parser which uses some heuristics to detect XML structures that are
better represented as JSON arrays.
If all what you want is more or less a nested HashMap<String,Object> then
you can easily write a simple converter for it (see the converter tutorial,
it's really easy) that handles a HashMap. At marshalling time iterate over
all entries of the map, write the key as element name. If the value is a
String, write it as text. If it is a HashMap, call the context to convert it
(see tutorial). During unmarshalling after reading the element with the key
name you will have to ask the reader if there are children. If yes, ask the
context to unmarshal it, otherwise read its text.
Register this converter for XStream and set an alias for HashMap to be
"root". Maybe you are inclined to use a LinkedHashMap instead, but then you
will have to additionally define that the LinkedHashMap is the default
implementation for Map. However, this supports a false assumption about the
sequence of the properties, because JSON specification explicitly defines no
guarantee about the sequence of the properties and a parser may return them
in arbitrary order.
Hope this helps,
Jörg
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email