2011-10-25 2 views
4

Java possède plusieurs frameworks de liaison XML qui mappent les objets Java en XML et inversement. Ces frameworks permettent de mapper différentes hiérarchies et classes Java dans la structure XML choisie. Ils peuvent être configurés via un fichier de configuration séparé. Ces cadres comprennent Castor, JiBX et autres. D'autres cadres peuvent être configurés par programme.Plusieurs liaisons json dans Java

La plupart des cadres de liaison JSON mappent simplement l'objet Java directement dans json. La plupart n'offrent pas la flexibilité de mapper des hiérarchies Java complexes dans n'importe quelle représentation d'objet JSON choisie arbitrairement. La configuration est généralement assez limitée.

J'essaie actuellement de créer un service Web qui renvoie des réponses JSON. Si mes classes de domaine Java changent de quelque façon que ce soit, mes réponses json changeront aussi, provoquant la rupture de tous les clients du service, s'attendant à ce que l'ancienne version des réponses json se brise. Y a-t-il des frameworks de liaison JSON totalement flexibles qui peuvent mapper plusieurs liaisons dans le même ensemble de classes?

Ou (peut-être la question plus fondamentale est) comment puis-je supporter différentes versions de liaisons JSON sur le même ensemble de classes Java? Ou devrais-je simplement m'assurer que mes classes de domaine ne changent jamais? (Cela ne semble pas faisable)

Répondre

0

Bonne question. Un que j'ai lutté avec moi-même sur une échelle un peu plus grande.

Le problème est que sérialiser un objet rompt l'encapsulation. Mais alors, l'affiche aussi sur une interface utilisateur. Mais si tu ne fais pas ça, à quoi ça sert?

La seule solution que j'ai été capable de créer est de créer un objet View. Un objet de vue a des getters et des setters qui permettent l'externalisation des parties de vue des données sans aucune des données privées nécessaires pour effectuer un traitement réel.

Le problème est que cela nécessite un codage en double, mais cela semble empêcher certains problèmes architecturaux à long terme.

Désolé de ne pas être plus utile, mais ce n'est que l'un de ces vilains problèmes que les ingénieurs en logiciel vont affronter pour toujours.

Mon .02 $.

+0

Je ne pense pas que ce soit une pratique standard pour créer une classe de vue complètement différente pour générer la res format de réponse. JiBX, par exemple, vous permet de lier plusieurs structures XML à une seule classe. Étant donné un nom de liaison particulier, la classe Java serait rassemblée dans une structure XML différente. C'est vraiment génial! Je cherche juste un framework JSON équivalent qui peut lier plusieurs structures JSON dans la même classe. Quelqu'un en connaît un là-bas? – onejigtwojig

1

Si vous utilisez JAXB en combinaison avec JAX-RS (Java API pour les services web RESTful), c'est facile. JAX-RS (ou au moins Jersey, les JAX-RS référence mise en œuvre) comprend annotations JAXB et pour le rendre JSON sortie au lieu de XML il vous suffit de changer le type de support de votre méthode WebService, par exemple:

@GET @Path("{customerId}") 
@Produces(MediaType.TEXT_XML) // Change this to MediaType.APPLICATION_JSON 
public Customer getCustomer(@PathParam("customerId") String customerId) { 
    // ... 
} 

Customer est une classe annotée à l'aide d'annotations de mappage JAXB (qui peuvent faire référence à d'autres classes avec des annotations, etc.).

2

Remarque: Je suis le EclipseLink JAXB (MOXy) et je suis membre du groupe d'experts JAXB 2 (JSR-22).

Le composant MOXy dans EclipseLink 2.4 contiendra le type de liaison JSON que vous recherchez. Dans l'exemple ci-dessous, un objet Address est mappé à la réponse Google's Geocoding API V2. Cet exemple montre comment le mappage basé sur le chemin élimine la nécessité d'une relation étroite entre les classes et la structure JSON.

package blog.geocode.json; 

import javax.xml.bind.annotation.XmlType; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlType(propOrder={"country", "state", "city", "street", "postalCode"}) 
public class Address { 

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()") 
    private String street; 

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:Locality/ns:LocalityName/text()") 
    private String city; 

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()") 
    private String state; 

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()") 
    private String country; 

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()") 
    private String postalCode; 

} 

Comme vous le mentionnez d'avoir un document de mappage séparé est la clé pour appliquer plusieurs correspondances à un modèle d'objet. Le document liant Moxy peut être mise à profit pour XML et JSON reliure:

Vous pouvez JSON lier aujourd'hui en utilisant l'une des étape construit:

+0

avez-vous un exemple de liaison à une structure json? – onejigtwojig

+0

L'exemple suivant montre comment mapper vers une structure JSON: http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy.html et cet exemple montre comment les mêmes métadonnées peuvent être utilisées pour mapper vers JSON et XML: http://blog.bdoughan.com/2011/08/binding-to-json-xml-geocode-example.html –

Questions connexes