2016-07-02 14 views
1

私はjackson-datatype-guavaを使用しています。 JSONからテーブルを逆シリアル化しようとしていますが、例外が発生しています。ジャクソンが「JsonMappingException:タイプに適したコンストラクタが見つかりません」というメッセージが表示される

私のコードは次のとおりです。

@Test 
public void jsonTable() throws IOException { 
    Table<String, String, String> table = HashBasedTable.create(); 
    table.put("row1", "col1", "cell11"); 
    table.put("row1", "col2", "cell12"); 
    table.put("row2", "col1", "cell21"); 
    table.put("row2", "col2", "cell22"); 

    ObjectMapper mapper = new ObjectMapper() 
      .registerModule(new GuavaModule()); 

    String tableJson = mapper.writeValueAsString(table); 
    System.out.println(tableJson); 

    Table<String, String, String> deserializedTable = mapper.readValue(tableJson, HashBasedTable.class); 
} 

最後の行でスローされた例外がある:HashBasedTableにはデフォルトコンストラクタを持っていないので

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.google.common.collect.HashBasedTable]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?) 
at [Source: {"row1":{"col2":"cell12","col1":"cell11"},"row2":{"col2":"cell22","col1":"cell21"}}; line: 1, column: 2] 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:255) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1130) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:298) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:133) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3807) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2797) 
    at com.gk.dfm.repository.impl.JsonTableTest.jsonTable(JsonTableTest.java:31) 

それは、理にかなっています。 HashBasedTable.create()を使用して構築する必要があります。どうしたらそれをジャクソンに伝えることができますか? this page

私はグアバのMultimapはデシリアライズする方法が見つかりました:私は表に適用することができますどのように

@Test 
public void convert() throws JsonParseException, JsonMappingException, 
     JsonProcessingException, IOException { 

    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.registerModule(new GuavaModule()); 

    Multimap<String, NavItem> navs = objectMapper.readValue(
      objectMapper.treeAsTokens(objectMapper.readTree(jsonString)), 
      objectMapper.getTypeFactory().constructMapLikeType(
        Multimap.class, String.class, NavItem.class)); 

    logger.info(navs); 

    assertThat(navs.keys(), hasItems("123455", "999999")); 
} 

を? constructTableLikeTypeのようなものはありません。 it has been moved under jackson-datatype-collections to simplify management, release process.

グァバのTableのサポートが不完全であると思われるので、an open issue for adding (de)serializer for itがありますので

答えて

2

まず、代わりに、ジャクソン・データ型・グァバのjackson-datatypes-collectionsを使用してみてください。それはオープンソースなので、あなた自身で行うことができます。もしそうなら、あなたは貢献してください - this pull request in old repositoryのような他の人が書いたものを使うことができます(see test for Tableでもシリアライズはサポートされますが、デシリアライズはしません)。

+0

ありがとうございます。私は 'Table 'を 'Map ' 'に変換して、それをシリアライズ/デシリアライズすると思います。ところで、jackson-datatypes-collectionsのドキュメントでは、ライブラリのすべてのコレクションのサポート状況について言及する必要があります(特に半分の作業であれば、誤解を招きます)。 –

関連する問題