sde*_*oot 3 java hash serialization json jackson
所以,标题基本上描述了我需要的东西.比如说,要序列化的bean看起来像这样:
public class SomeBean {
public String someString;
}
Run Code Online (Sandbox Code Playgroud)
我希望Jackson 像这样序列化SomeBean的一个实例:
{
someString: '<the value>',
__hash_someString: '<a proprietary hash of <the value>>'
}
Run Code Online (Sandbox Code Playgroud)
此功能应该是通用的.我不想为SomeBean编写特定的序列化程序,因为这需要在多个位置进行.将" __hash_someString " 添加到类本身不是一个选项,因为它会污染模型.
履行
我希望杰克逊能正常处理豆子.但是当遇到特定的注释(@GenerateHash)时,它应该像之前一样向对象添加另一个字段.所以它想这样:
public class SomeBean {
@GenerateHash
public String someString;
}
Run Code Online (Sandbox Code Playgroud)
这条路到目前为止
有很多类似的主题,但没有一个尝试这样的事情.我并没有真正进入Jackson Serialization的内部工作,但似乎你只能选择修改一个整体的对象.我还没有找到一种方法来拦截字段的序列化过程,只有该字段的值.
我试图使用BeanSerializerModifier实现这一点,并尝试使用@Serializer.但是,我通常最终会陷入无限循环.
我咨询的资源是(不限于):
简而言之, 我怎样才能让杰克逊序列化
public class SomeBean {
@GenerateHash
public String someString;
public String unaffectedString;
}
Run Code Online (Sandbox Code Playgroud)
对此:
{
someString: '<the value>',
__hash_someString: '<a proprietary hash of <the value>>',
unaffectedString: '<some value>'
}
Run Code Online (Sandbox Code Playgroud)
这非常有趣.我想你可以解决这个问题BeanSerializerModifier.
我们的想法是注册一个自定义序列化程序,它可以访问原始的bean序列化程序,属性描述和对象值.如果使用注释对属性进行GenerateHash批注,则序列化程序将发出其他字段.这是一个例子:
public class JacksonGenerateHash {
@Retention(RetentionPolicy.RUNTIME)
public static @interface GenerateHash {
}
public static class Bean {
@GenerateHash
public final String value;
public Bean(final String value) {
this.value = value;
}
}
private static class MyBeanSerializerModifier extends BeanSerializerModifier {
@Override
public JsonSerializer<?> modifySerializer(
final SerializationConfig serializationConfig,
final BeanDescription beanDescription,
final JsonSerializer<?> jsonSerializer) {
return new HashGeneratingSerializer((JsonSerializer<Object>) jsonSerializer, null);
}
}
private static class HashGeneratingSerializer extends JsonSerializer<Object>
implements ContextualSerializer {
private final JsonSerializer<Object> serializer;
private final BeanProperty property;
public HashGeneratingSerializer(
final JsonSerializer<Object> jsonSerializer,
final BeanProperty property) {
this.serializer = jsonSerializer;
this.property = property;
}
@Override
public void serialize(
final Object o,
final JsonGenerator jsonGenerator,
final SerializerProvider serializerProvider)
throws IOException {
serializer.serialize(o, jsonGenerator, serializerProvider);
// if the generatehash is present the property must be set
if (property != null) {
jsonGenerator.writeNumberField("_hash_" + property.getName(), o.hashCode());
}
}
// override this method to access the bean property
@Override
public JsonSerializer<?> createContextual(
final SerializerProvider prov, final BeanProperty property)
throws JsonMappingException {
if (property != null && property.getAnnotation(GenerateHash.class) != null) {
return new HashGeneratingSerializer(serializer, property);
}
return serializer;
}
}
public static void main(String[] args) throws JsonProcessingException {
SimpleModule module = new SimpleModule();
module.setSerializerModifier(new MyBeanSerializerModifier());
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
System.out.println(mapper.writeValueAsString(new Bean("abc")));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
{"value":"abc","_hash_value":96354}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1354 次 |
| 最近记录: |