jackson 将hashmap转换为json,同时过滤一些键?

mklgxw1f  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(63)

我正在尝试将hashmap转换为json,同时过滤一些键。我试过和Jackson在一起,但结果总是有所有的关键。

Map<String, String> hashtable = new HashMap();
hashtable.put("KEY1", "VALUE1");
hashtable.put("KEY2", "VALUE2");
hashtable.put("KEY3", "VALUE3");

ObjectMapper objectMapper = new ObjectMapper();
FilterProvider filter = new SimpleFilterProvider().addFilter("filter", SimpleBeanPropertyFilter.filterOutAllExcept("KEY1"));
objectMapper.setFilterProvider(filter);
System.err.println(objectMapper.writeValueAsString(hashtable));

我的钥匙是动态的,有没有更有效的方法来做到这一点?
Jackson的过滤方法对我来说是完美的,因为我需要为同一个HashMap生成多个json的不同过滤器。和Jackson在一起有可能吗?

4uqofj5v

4uqofj5v1#

Here是你的问题的答案。您应该创建不带任何字段的mixinSource类,并将其添加到objectMapper。然后,您可以动态过滤出Map

@JsonFilter("filter")
public class DynamicMixIn {

}
Map<String, String> hashtable = new HashMap();
hashtable.put("KEY1", "VALUE1");
hashtable.put("KEY2", "VALUE2");
hashtable.put("KEY3", "VALUE3");

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(Object.class, DynamicMixIn.class);
FilterProvider filter = new SimpleFilterProvider().addFilter("filter", SimpleBeanPropertyFilter.serializeAllExcept("KEY1"));
objectMapper.setFilterProvider(filter);
String filtered = objectMapper.writeValueAsString(hashtable); // {"KEY2":"VALUE2","KEY3":"VALUE3"}
y4ekin9u

y4ekin9u2#

您可以设置包含SimpleBeanPropertyFilterFilterProvider

**注意:**在本例中,validKeys可以作为参数传递给createFilterProvider,并存储在FilterProvider上,而不是KeyFilter驱动程序上。

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.introspect.Annotated;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;

public class KeyFilter {
    private static ObjectMapper mapper;
    private static Set<String> validKeys;

    static {
        mapper = new ObjectMapper();
        mapper.setFilterProvider(createFilterProvider());

        validKeys = new HashSet<>();
        validKeys.add("KEY1");
    }

    public static void main(String[] args) throws JsonProcessingException {
        Map<String, String> hashtable = new HashMap<>();

        hashtable.put("KEY1", "VALUE1");
        hashtable.put("KEY2", "VALUE2");
        hashtable.put("KEY3", "VALUE3");

        System.out.println(mapper.writeValueAsString(hashtable)); // {"KEY1":"VALUE1"}
    }

    // Derived from: https://stackoverflow.com/a/25232485/1762224
    private static FilterProvider createFilterProvider() {
        SimpleFilterProvider filterProvider = new SimpleFilterProvider();
        final String filterName = "valid-key-filter";
        mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
            @Override
            public Object findFilterId(Annotated a) {
                if (Map.class.isAssignableFrom(a.getRawType())) {
                    return filterName;
                }
                return super.findFilterId(a);
            }
        });
        filterProvider.addFilter(filterName, new SimpleBeanPropertyFilter() {
            @Override
            protected boolean include(BeanPropertyWriter writer) {
                return true;
            }
            @Override
            protected boolean include(PropertyWriter writer) {
                return validKeys.contains(writer.getName());
            }
        });
        return filterProvider;
    }
}

相关问题