使用Jackson库从JSON反序列化时,以自定义方式(不是通过调用默认构造函数)实例化bean的最佳和最简单方法是什么?我发现有JsonDeserializer可以实现的界面,但我不太确定如何将它们连接在一起ObjectMapper.
更新#1:我认为我的问题需要更多细节.默认情况下,Jackson的反序列化器使用默认构造函数来创建bean.我希望能够通过调用外部工厂来实现bean的实例化.所以我需要的只是一个需要实例化的bean类.工厂将返回实例,然后可以提供给杰克逊的财产人口等.
请注意,我不关心创建简单/标量值,如字符串或数字,只有bean在我感兴趣的区域.
一些可能有帮助的事情......
首先,您可以使用@JsonCreator来定义要使用的备用构造函数(所有参数都必须使用@JsonProperty注释,因为字节码没有名称)或静态工厂.它仍然是值类的一部分,但可以帮助支持不可变对象.
其次,如果您想要真正的自定义反序列化过程,可以查看http://wiki.fasterxml.com/JacksonHowToCustomDeserializers,它解释了如何注册自定义反序列化器.
杰克逊目前遗漏的一件事是对建筑风格的物品的支持; 有一个功能请求添加支持(计划是在开发人员有时间后添加支持).
您将反序列化器放在要将 json 映射到的 Java 对象上:
@JsonDeserialize(using = PropertyValueDeserializer.class)
public class PROPERTY_VALUE implements Serializable{
Run Code Online (Sandbox Code Playgroud)
然后在解串器中您可以执行以下操作:
@Override
public PROPERTY_VALUE deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
String tmp = jsonParser.getText(); // {
jsonParser.nextToken();
String key = jsonParser.getText();
jsonParser.nextToken();
String value = jsonParser.getText();
jsonParser.nextToken();
tmp = jsonParser.getText(); // }
PROPERTY_VALUE pv = new PROPERTY_VALUE(key,value);
return pv;
}
Run Code Online (Sandbox Code Playgroud)
如果您不想使用注释,则需要传递映射器 a ,DeserializerProvider它可以为给定类型提供正确的反序列化器。
mapper.setDeserializerProvider(myDeserializerProvider);
Run Code Online (Sandbox Code Playgroud)
对于构造函数 - 当然,您可以通过调用反序列化器中的工厂来生成目标类:
String value = jsonParser.getText();
jsonParser.nextToken();
tmp = jsonParser.getText(); // }
MyObject pv = MyObjectFactory.get(key);
pv.setValue(value);
return pv;
}
Run Code Online (Sandbox Code Playgroud)
但我可能误解了你的更新
| 归档时间: |
|
| 查看次数: |
3802 次 |
| 最近记录: |