我有一个REST WS来更新一个接收JSON字符串作为输入的bean对象。
ABean entity = svc.findEntity(...);
objectMapper.readerForUpdating(entity).readValue(json);
[...]
svc.save(entity);
ABean是一种复杂类型,还包含其他对象, 例如:
class ABean {
public BBean b;
public CBean c;
public String d;
}
svc.save(…) 将保存bean和嵌入的对象 。
出于安全原因,我想过滤掉一些可以由JSON字符串更新的属性,但是我想动态地做到这一点,以便对于每个WS(或用户角色),我都可以决定阻止哪些属性被更新(所以我不能简单地使用杰克逊景观)
总而言之,有什么方法可以在JSON反序列化期间动态过滤掉属性?
另一种方法是使用BeanDeserializerModifier:
private static class BeanDeserializerModifierForIgnorables extends BeanDeserializerModifier {
private java.lang.Class<?> type;
private List<String> ignorables;
public BeanDeserializerModifierForIgnorables(java.lang.Class clazz, String... properties) {
ignorables = new ArrayList<>();
for(String property : properties) {
ignorables.add(property);
}
this.type = clazz;
}
@Override
public BeanDeserializerBuilder updateBuilder(
DeserializationConfig config, BeanDescription beanDesc,
BeanDeserializerBuilder builder) {
if(!type.equals(beanDesc.getBeanClass())) {
return builder;
}
for(String ignorable : ignorables) {
builder.addIgnorable(ignorable);
}
return builder;
}
@Override
public List<BeanPropertyDefinition> updateProperties(
DeserializationConfig config, BeanDescription beanDesc,
List<BeanPropertyDefinition> propDefs) {
if(!type.equals(beanDesc.getBeanClass())) {
return propDefs;
}
List<BeanPropertyDefinition> newPropDefs = new ArrayList<>();
for(BeanPropertyDefinition propDef : propDefs) {
if(!ignorables.contains(propDef.getName())) {
newPropDefs.add(propDef);
}
}
return newPropDefs;
}
}
您可以使用以下命令将修改器注册到ObjectMapper:
BeanDeserializerModifier modifier = new BeanDeserializerModifierForIgnorables(YourType.class, "name");
DeserializerFactory dFactory = BeanDeserializerFactory.instance.withDeserializerModifier(modifier);
ObjectMapper mapper = new ObjectMapper(null, null, new DefaultDeserializationContext.Impl(dFactory));
然后定义的属性将被忽略。如果使用@JsonAnySetter批注,则可以忽略updateBuilder方法。
马丁问候
问题内容: 我有一个像这样的JSON字符串: 现在,我将使用 Jackson 2.0进行 解析。我正在尝试从JSON字符串获取a 。 可能吗? 问题答案: 您的媒体资源看起来不像数组。它代表具有动态属性的对象,因此我们应将其视为对象。如果我们对属性一无所知,可以使用注释。算法可能如下所示: 将JSON反序列化为JSON模型类。 使用ObjectMapper将动态对象(地图)转换为应用的POJO类
我对jackson进行了配置,以便在和时给出一个简单的字符串表示。这可以在序列化过程中找到,例如,当我在REST API上获得数据时。 但反过来就不行了。当我试图将数据发送到服务器,并且应该将JSON解析为java对象时,会引发此异常: 很抱歉没有提到我在单元测试中。 TestClass:
问题内容: 我有一个像这样的JSON字符串: 现在,我将使用 Jackson 2.0进行 解析。我正在尝试从JSON字符串获取a 。 可能吗? 问题答案: 您的媒体资源看起来不像数组。它代表具有动态属性的对象,因此我们应将其视为对象。如果我们对属性一无所知,可以使用注释。算法可能如下所示: 将JSON反序列化为JSON模型类。 使用ObjectMapper将动态对象(地图)转换为应用的POJO类
问题内容: 当序列化具有其他对象引用的Java对象时,我只需要序列化嵌套对象的一个属性(通常为外键,因此序列化对象引用的“ id”属性)。拥有其他一切。 例如,我有两个类需要将其序列化为JSON和XML(为清楚起见,删除了JPA注释): 关系:用户- >(一对多)AddressInformation;另外:AddressInformation->(一对一)用户 地址信息: 例如,当序列化用户时
我明白它无法从嵌套JSON反序列化字符串。我解决这个问题的一个方法是通过编写自定义映射器 但是只要pojo中有变化,这就需要修改映射器,添加/删除字段。Mixin工作时没有任何变化,我该如何更新我的Mixin来处理objectId呢?
我想用scala中的jackson反序列化json json_结构: {“type”:“struct”,“fields”:[{“name”:“code_role”,“type”:“string”,“nullable”:true,“metadata”:{“HIVE_type_string”:“string”},{“name”:“libelle_role”,“type”:“string”,“nulla