Giter Club home page Giter Club logo

jackson-antpathfilter's Introduction

Jackson AntPath Property Filter

A Jackson Filter matching the path of the current value to serialize against the AntPathMatcher. The inclusion / exclusion works similar to the ant file include / exclude functionality. Ant / Maven users should mostly be aware of how this works.

Build Status

Requirements

  • Java 5
  • Jackson 2.5.0+ (2.5.0.RELEASE and its dependencies included)

Installation

For Maven and Maven-compatible dependency managers

Add a dependency to your project with the following co-ordinates:

  • GroupId: ch.mfrey.jackson
  • ArtifactId: jackson-antpathfilter
  • Version: ${jackson-antpathfilter.version}
<dependency>
	<groupId>ch.mfrey.jackson</groupId>
	<artifactId>jackson-antpathfilter</artifactId>
	<version>${jackson-antpathfilter.version}</version>
</dependency>

Usage

String[] filter = new String[] {"*", "*.*", "!not.that.path"};

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(Object.class, AntPathFilterMixin.class);

FilterProvider filterProvider = new SimpleFilterProvider().addFilter("antPathFilter", new AntPathPropertyFilter(filter));
objectMapper.setFilters(filterProvider);

objectMapper.writeValueAsString(someObject);

= Inclusion:

"*", "**", "*.*", "someproperty.someNesterProperty.*",

= Exclusion:

"!property", "!**.someExpensiveMethod";

Spring Integration

= With Spring 4.2.2+

public class AntPathMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {

    public AntPathMappingJackson2HttpMessageConverter(ObjectMapper originalObjectMapper) {
        super(originalObjectMapper.copy().addMixIn(Object.class, HibernateAwareAntPathFilterMixin.class));
    }

    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        return AntPathFilterMappingJacksonValue.class.isAssignableFrom(clazz);
    }

    @JsonFilter("antPathFilter")
    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    public static class HibernateAwareAntPathFilterMixin {
    }
}

public class AntPathFilterMappingJacksonValue<T> extends MappingJacksonValue {

    public AntPathFilterMappingJacksonValue(final T value, final String... filters) {
        super(value);
        setFilters(new SimpleFilterProvider().addFilter("antPathFilter", new AntPathPropertyFilter(filters)));
    }
}
@Configuration
@EnableWebMvc
public class DispatcherConfiguration extends WebMvcConfigurerAdapter {

    @Bean
    public FactoryBean<ObjectMapper> jacksonObjectMapperFactory() {
    	// Normal Jackson configuration
    }
    
    @Bean
    public HttpMessageConverter antpathJacksonConverter() {
        return new AntPathMappingJackson2HttpMessageConverter(jacksonObjectMapperFactory().getObject());
    }
    
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(0, antpathJacksonConverter());
    }
}
@Controller
@RequestMapping(value = "/someObject")
public class SomeController {
    
    @RequestMapping
    @ResponseBody
    public AntPathFilterMappingJacksonValue<SomeClass> getSomeObject() {
        return new AntPathFilterMappingJacksonValue<>(someObject, "*", "*.*", "!not.that.path");
    }
}

Examples (from the Unit Tests)

Data

{
  "address": {
    "streetName":"At my place",
    "streetNumber":"1"
  },
  "email":"[email protected]",
  "firstName":"Martin",
  "lastName":"Frey",
  "manager":{
    "address":null,
    "email":"[email protected]",
    "firstName":"John",
    "lastName":"Doe",
    "manager":null
  }
}
    
Filter: **,
Result: {"address":{"streetName":"At my place","streetNumber":"1"},"email":"[email protected]","firstName":"Martin","lastName":"Frey","manager":{"address":null,"email":"[email protected]","firstName":"John","lastName":"Doe","manager":null}}
Filter: firstName,
Result: {"firstName":"Martin"}
Filter: **,!manager,
Result: {"address":{"streetName":"At my place","streetNumber":"1"},"email":"[email protected]","firstName":"Martin","lastName":"Frey"}
Filter: manager,manager.firstName,manager.lastName,
Result: {"manager":{"firstName":"John","lastName":"Doe"}}
Filter: *,address.*,manager.firstName,
Result: {"address":{"streetName":"At my place","streetNumber":"1"},"email":"[email protected]","firstName":"Martin","lastName":"Frey","manager":{"firstName":"John"}}
Filter: **,-manager,!**.streetNumber,
Result: {"address":{"streetName":"At my place"},"email":"[email protected]","firstName":"Martin","lastName":"Frey"}
Filter: "reports", "reports.firstName"
Result: {"reports":[{"firstName":"First 0"},{"firstName":"First 1"},{"firstName":"First 2"},{"firstName":"First 3"},{"firstName":"First 4"},{"firstName":"First 5"},{"firstName":"First 6"},{"firstName":"First 7"},{"firstName":"First 8"},{"firstName":"First 9"}]}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.