0

私は次のことをしています:

IronRunId Id = new IronRunId("RunObject", "Runid1", 4);
ObjectMapper MAPPER = new ObjectMapper();
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("RunId", Id);
String json = MAPPER.writeValueAsString(map);

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map1 = mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
IronRunId runId = (IronRunId) (map1.get("RunId"));

しかし、これによりエラーが発生します: java.util.LinkedHashMap を IronRunId にキャストできません。

逆に、もしそうなら:

List<Object> myList = new ArrayList<Object>();
myList.add("Jonh");
myList.add("Jack");
map.put("list", myList);

次に、mapper.readValue を実行した後に map.get() によって返されるオブジェクトは、ArrayList 型です。

違いはなぜですか?デフォルトの型をマップに挿入すると、正しいオブジェクトが返されます。ただし、カスタムメイドのオブジェクトをマップに挿入してもそうではありません。

誰もこれを行う方法を知っていますか?

4

2 に答える 2

2
Map<String, Object> map1 = mapper.readValue(json, new TypeReference<Map<String, Object>>() {});

基本的には、String 型のキーと Object 型の値を持つ Map を返します。したがって、Jackson は type のキーと typeStringの値を提供しObjectました。ジャクソンはあなたのカスタムオブジェクトについて知りません。Objectそれが、 a Map、具体的にはa である独自のネイティブバウンドをあなたに与えLinkedHashMapた理由です。LinkedHashMapgetMap

したがって、次のように変更します。

Map<String, IronRunId> map1 = mapper.readValue(json, new TypeReference<Map<String, IronRunId>>() {});

また、具象型よりもインターフェイス型の Object を宣言することをお勧めします。だから代わりに

HashMap<String, Object> map = new HashMap<String, Object>();

成功する

Map<String, Object> map = new HashMap<String, Object>();

編集

追加した質問への回答として、すべてのオブジェクトを処理するラッパー オブジェクトを作成できます。このようなもの。

class Wrapper{

    private IronRunId ironRunId;
    private long time;
    private Map<String, String> aspects;
    private String anotherString;

    public long getTime() {
        return time;
    }
    public void setTime(long time) {
        this.time = time;
    }
    public Map<String, String> getAspects() {
        return aspects;
    }
    public void setAspects(Map<String, String> aspects) {
        this.aspects = aspects;
    }
    public String getAnotherString() {
        return anotherString;
    }
    public void setAnotherString(String anotherString) {
        this.anotherString = anotherString;
    }
    public IronRunId getIronRunId() {
        return ironRunId;
    }
    public void setIronRunId(IronRunId ironRunId) {
        this.ironRunId = ironRunId;
    }
}

その後、このクラスにさまざまなオブジェクトを格納できます。

改訂版

public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException{
    IronRunId Id = new IronRunId("RunObject", "Runid1", 4);
    Map<String, String> aspects = new HashMap<String, String>();
    aspects.put("aspectskey1", "aspectsValue1");
    aspects.put("aspectskey2", "aspectsValue2");
    aspects.put("aspectskey3", "aspectsValue3");
    String anotherString = "anotherString";
    long time = 1L;

    Wrapper objectWrapper = new Wrapper();
    ObjectMapper objectMapper = new ObjectMapper();

    objectWrapper.setIronRunId(Id);
    objectWrapper.setTime(time);
    objectWrapper.setAnotherString(anotherString);
    objectWrapper.setAspects(aspects);

    Map<String, Wrapper> map = new HashMap<String, Wrapper>();
    map.put("theWrapper", objectWrapper);
    String json = objectMapper.writeValueAsString(map);

    Map<String, Wrapper> map1 = objectMapper.readValue(json, new TypeReference<Map<String, Wrapper>>() {});
    Wrapper wrapper = map1.get("theWrapper");

    System.out.println("run id : " +  wrapper.getIronRunId().toString());
    System.out.println("time : " + wrapper.getTime());
    System.out.println("aspects : " + wrapper.getAspects().toString());
    System.out.println("anotherString : " + wrapper.getAnotherString());
}
于 2013-07-24T02:12:04.797 に答える