使用自定义反序列化器反序列化而不是仅设置字段时,Jackson创建新实例

时间:2015-02-24 09:20:06

标签: java json jackson deserialization

不容易解释标题,但我尝试做的是反序列化bean并使用自定义反序列化器反序列化该bean上的特定字段。

我有以下json数组

[  
   {  
      "name":"contact1",
      "phone":"0655555058",
      "image":{  
         "keyname":"bear.jpg",
         "filename":"bear",
         "extension":".jpg"
      }
   },
   {  
      "name":"contact2",
      "phone":"0655555058",
      "image":{  
         "keyname":"bear.jpg",
         "filename":"bear",
         "extension":".jpg"
      }
   }
]

和我的联系人bean

public class Contact{

    public String name;
    public String phone;
    public Document image;

}

我为Document class

注册了一个自定义反序列化器
 ObjectMapper mapper = new ObjectMapper();
 SimpleModule module = new SimpleModule();
 module.addDeserializer(Document.class, new DocumentDeserializer());
 mapper.registerModule(module);

解串器工作我没有问题。但是当我尝试使用:

反序列化我的json数组时
List<Contact> list = mapper.readValue(toDeserialize, mapper.getTypeFactory().constructCollectionType(List.class, Contact.class));

我没有包含2个联系人的列表,而是列出了包含4个联系人的列表。 2使用正确的名称和电话更正联系人但图像为空。还有另外两个没有名字和没有电话的联系人,但图片来自自定义解串器。

那么为什么图像没有设置为正确的联系人?

我也有:

@JsonDeserialize(using = DocumentDeserializer.class)

在我的文档bean上。

我想避免在我的联系人类的我的图片字段中添加注释,因为我的应用程序中有很多文档字段。

我做错了什么?

更新反序列化器:

public class DocumentDeserializer extends StdDeserializer<Document> {

    BinariesManager manager = new BasicS3Manager(CommonVars.S3AccessKey, CommonVars.S3SecretKey, CommonVars.S3Bucket);

    public DocumentDeserializer() {
        super(Document.class);
    }

    @Override
    public Document deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        String filename = node.get("filename").textValue();
        String extension = node.get("extension").textValue();
        String keyname = node.get("keyname").textValue();

        Document document = buildDocumentBasedOnFileExtension(extension);

        document.setTitle(filename);
        File f = downloadFile(filename, extension, keyname);
        document.load(f);
        return document;
    }

1 个答案:

答案 0 :(得分:-1)

如果一切都失败了。你也可以转用另一种方法......

使用json-api库:https://jsonp.java.net/download.html