2012-12-11 4 views
2

Je souhaite sérialiser et désérialiser les entités hibernate qui contiennent d'autres entités au format JSON plat. Alors disons que j'ai les entités suivantes:Jackson - sérialisation des entités hibernate

clés:

@Entity 
public class Key implements Serializable{ 

private static final long serialVersionUID = 1L; 

@Id 
@Column(name = "KeyID") 
private Long id; 

@Column 
private String description; 

@ManyToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "KeyTypeID", nullable = false) 
private KeyType keyType; 

public Long getId() { 
    return id; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public KeyType getKeyType() { 
    return keyType; 
} 

public void setKeyType(KeyType keyType) { 
    this.keyType = keyType; 
} 
} 

KeyType:

@Entity 
public class KeyType implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@Column(name = "KeyTypeID") 
private Long id; 

@Column(name = "Name", nullable = false, unique = true) 
private String name; 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 
} 

Je veux sérialiser des objets de classe Key dans:

{ 
    "keyID": 1,  
    "description": "key 1", 
    "keyTypeName": "Type 5" //this is Key.keyType.name 
} 

I veulent aussi pouvoir désérialiser au-dessus de JSON dans l'objet Key contenant l'entité KeyType. Est-ce possible en utilisant Jackson ou dois-je implémenter du code personnalisé?

+1

Pour ce cas précis, vous devez utiliser une coutume sérialisé/désérialiseur htt p: //wiki.fasterxml.com/JacksonHowToCustomSerializers –

Répondre

0

Note: Je suis le chef EclipseLink JAXB (MOXy) et un membre du groupe d'experts JAXB (JSR-222). Je ne suis pas sûr si ce cas d'utilisation est pris en charge dans Jackson, mais ci-dessous est un exemple de la façon dont vous pouvez le faire en utilisant l'extension MOXy @XmlPath.

Key

En spécifiant @XmlPath(".") le contenu de l'objet de référence sont tiré vers le haut dans le noeud correspondant à l'objet source.

import java.io.Serializable; 

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

@Entity 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Key implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "KeyID") 
    @XmlElement(name="keyID") 
    private Long id; 

    @Column 
    private String description; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "KeyTypeID", nullable = false) 
    @XmlPath(".") 
    private KeyType keyType; 

} 

KeyType

L'annotation @XmlElement est mis à profit pour la carte à une clé JSON.

import java.io.Serializable; 
import javax.persistence.*; 
import javax.xml.bind.annotation.XmlElement; 

@Entity 
public class KeyType implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "KeyTypeID") 
    private Long id; 

    @Column(name = "Name", nullable = false, unique = true) 
    @XmlElement(name="keyTypeName") 
    private String name; 

} 

jaxb.properties

Pour spécifier Moxy comme fournisseur de JAXB vous devez inclure un fichier appelé jaxb.properties dans le même package que le modèle de domaine avec l'entrée suivante:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

Démo

Le code démo ci-dessous avec convertir votre document JSON vers/depuis votre modèle de domaine.

import java.util.*; 
import javax.xml.bind.*; 
import javax.xml.transform.stream.StreamSource; 
import org.eclipse.persistence.jaxb.JAXBContextProperties; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(); 
     properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json"); 
     properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {Key.class}, properties); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     StreamSource json = new StreamSource("src/forum13819583/input.json"); 
     Key key = unmarshaller.unmarshal(json, Key.class).getValue(); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(key, System.out); 
    } 

} 

entrée.JSON/sortie

{ 
    "keyID": 1,  
    "description": "key 1", 
    "keyTypeName": "Type 5" 
} 

Pour plus d'informations

Questions connexes