2

他のエンティティを含む休止状態のエンティティをフラットな JSON 形式にシリアライズおよびデシリアライズしたいと考えています。したがって、次のエンティティがあるとします。

鍵:

@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;
}
}

キータイプ:

@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;
}
}

Key クラスのオブジェクトを次のようにシリアライズしたい:

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

また、上記の JSON を KeyType エンティティを含む Key オブジェクトに逆シリアル化できるようにしたいと考えています。Jackson を使用してそれは可能ですか、それともカスタム コードを実装する必要がありますか?

4

1 に答える 1

0

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

このユース ケースが Jackson でサポートされているかどうかはわかりませんが、MOXy の@XmlPath拡張機能を使用してこれを行う方法の例を以下に示します。

参照オブジェクトの内容を指定することにより@XmlPath(".")、ソース オブジェクトに対応するノードにプルアップされます。

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;

}

キータイプ

注釈は、@XmlElementJSON キーにマップするために利用されます。

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

MOXy を JAXB プロバイダーとして指定するにはjaxb.properties、次のエントリを使用して、ドメイン モデルと同じパッケージで呼び出されるファイルを含める必要があります。

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

デモ

以下のデモ コードでは、JSON ドキュメントをドメイン モデルとの間で変換します。

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);
    }

}

input.json/出力

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

詳細については

于 2012-12-12T18:49:42.617 に答える