2

リスト:

import java.util.List;

public class Listing<T> {
    List<Thing<T>> children;

    public List<Thing<T>> getChildren() {
        return children;
    }

    public void setChildren(List<Thing<T>> children) {
        this.children = children;
    }
}

もの:

public class Thing<T> {

    private String type;
    private T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

リンク:

public class Link {
    private String author;

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

これがシリアライゼーションとデシリアライゼーションの例です...

public static void main(String[] args) throws IOException {
    Link link1 = new Link();
    link1.setAuthor("JohnDoe");

    Link link2 = new Link();
    link2.setAuthor("MaryJane");

    List<Thing<Link>> things = new ArrayList<Thing<Link>>();

    Thing<Link> thing1 = new Thing();
    thing1.setData(link1);
    thing1.setType("t3");

    Thing<Link> thing2 = new Thing();
    thing2.setData(link2);
    thing2.setType("t3");

    things.add(thing1);
    things.add(thing2);

    Listing<Link> listing = new Listing<Link>();
    listing.setChildren(things);


    Thing<Listing> thing = new Thing<Listing>();
    thing.setType("listing");
    thing.setData(listing);

    File jsonFile = new File("src/testMap.txt");
    ObjectMapper mapper = new ObjectMapper();
    mapper.writeValue(jsonFile, thing);

    //String jsonString = "{\"type\":\"listing\",\"data\":{\"children\":[{\"type\":\"t3\",\"data\":{\"author\":\"JohnDoe\"}},{\"type\":\"t3\",\"data\":{\"author\":\"MaryJane\"}}]}}";
    JavaType jsonType = mapper.getTypeFactory().constructParametricType(Thing.class, Listing.class);
    Thing<Listing> readThing = mapper.readValue(jsonFile, jsonType);


}

私が抱えている問題は、上記のサンプル コードのリストに含まれるモノが Link でパラメータ化されていないため、それらのデータ フィールドがオブジェクト (実際には LinkedHashMap) として返されることです。

私はこのようなことができるようにしたい:

List<Thing<Link>> readListingChildren = readThing.getData().getChildren();
String author = readListingChildren.get(0).getData().getAuthor();

私の質問は、Jackson json を使用してこれを機能させるにはどうすればよいですか?

注: モノには複数の異なるタイプのオブジェクトが含まれ、モノのデータ メンバーのタイプは、t1、t2、t3 などの文字列を使用して、データ オブジェクトの「タイプ」フィールドによって定義されます (または定義する必要があります)。異なるクラスにマップします。

4

1 に答える 1

4

のようなシリアル化された文字列を実現するには

{
    "data":{
        "type":"listing",
        "children":[
            {
                    "data":{
                    "type":"t3",
                    "author":"JohnDoe"
                }
            },
            {
                "data":{
                    "type":"t3",
                    "author":"MaryJane"
                }
            }
        ]
    }
}

情報を使用して、使用するtype具象クラスを正しく逆シリアル化する

@JsonTypeName("listing")
public class Listing<T> {
    List<Thing<T>> children;

    public List<Thing<T>> getChildren() {
        return children;
    }

    public void setChildren(final List<Thing<T>> children) {
        this.children = children;
    }
}

public class Thing<T> {
    private T data;

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
    @JsonSubTypes({
      @JsonSubTypes.Type(Link.class),
      @JsonSubTypes.Type(Listing.class)
    })
    public T getData() {
        return data;
    }

    public void setData(final T data) {
        this.data = data;
    }
}

@JsonTypeName("t3")
public class Link {
    private String author;

    public String getAuthor() {
        return author;
    }

    public void setAuthor(final String author) {
        this.author = author;
    }
}
于 2013-04-20T12:25:43.230 に答える