-
-
Save sdorra/a59a7cb95c49afc84ed26211350c1321 to your computer and use it in GitHub Desktop.
public class App { | |
public static void main(String[] args) { | |
Type type = new Type("hg", "Mercurial"); | |
Repository repository = new Repository("42", "scm", type, "SCM-Manager", "SCM-Manager Repository Hosting"); | |
System.out.println(JSON.asString(repository)); | |
System.out.println(JSON.asString(repository, "id", "desc")); | |
System.out.println(JSON.asString(repository, "id", "name", "type", "type.name", "displayName")); | |
} | |
} |
import com.fasterxml.jackson.core.JsonGenerator; | |
import com.fasterxml.jackson.core.JsonProcessingException; | |
import com.fasterxml.jackson.core.JsonStreamContext; | |
import com.fasterxml.jackson.databind.ObjectMapper; | |
import com.fasterxml.jackson.databind.SerializerProvider; | |
import com.fasterxml.jackson.databind.introspect.Annotated; | |
import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair; | |
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; | |
import com.fasterxml.jackson.databind.ser.PropertyFilter; | |
import com.fasterxml.jackson.databind.ser.PropertyWriter; | |
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; | |
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; | |
import com.fasterxml.jackson.databind.type.TypeFactory; | |
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; | |
import java.util.Collections; | |
import java.util.HashSet; | |
import java.util.Set; | |
/** | |
* Sample filtering fields durring json marshalling. | |
* | |
* @author Sebastian Sdorra | |
*/ | |
public class JSON { | |
private static final String DEFAULT_FILTER = "__default"; | |
private static final String DOT = "."; | |
private static final ObjectMapper MAPPER = new ObjectMapper().setAnnotationIntrospector( | |
new AnnotationIntrospectorPair( | |
new FilteringAnnotationInpector(), new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()) | |
) | |
); | |
public static String asString(Object object, String... fields) { | |
PropertyFilter filter = filter(fields); | |
SimpleFilterProvider provider = new SimpleFilterProvider(); | |
provider.addFilter(DEFAULT_FILTER, filter); | |
try { | |
return MAPPER.writer(provider).writeValueAsString(object); | |
} catch (JsonProcessingException ex) { | |
throw new RuntimeException("failed to marshall", ex); | |
} | |
} | |
private static PropertyFilter filter(String[] fields) { | |
PropertyFilter filter; | |
if (fields.length > 0) { | |
Set<String> properties = new HashSet<>(fields.length); | |
Collections.addAll(properties, fields); | |
filter = new DeepFieldFilter(properties); | |
} else { | |
filter = SimpleBeanPropertyFilter.serializeAll(); | |
} | |
return filter; | |
} | |
private static class FilteringAnnotationInpector extends JacksonAnnotationIntrospector { | |
private static final long serialVersionUID = -8722016441050379430L; | |
@Override | |
public String findFilterId(Annotated a) { | |
return DEFAULT_FILTER; | |
} | |
} | |
private static class DeepFieldFilter extends SimpleBeanPropertyFilter { | |
private final Set<String> includes; | |
private DeepFieldFilter(Set<String> includes) { | |
this.includes = includes; | |
} | |
private String createPath(PropertyWriter writer, JsonGenerator jgen) { | |
StringBuilder path = new StringBuilder(); | |
path.append(writer.getName()); | |
JsonStreamContext sc = jgen.getOutputContext(); | |
if (sc != null) { | |
sc = sc.getParent(); | |
} | |
while (sc != null) { | |
if (sc.getCurrentName() != null) { | |
if (path.length() > 0) { | |
path.insert(0, DOT); | |
} | |
path.insert(0, sc.getCurrentName()); | |
} | |
sc = sc.getParent(); | |
} | |
return path.toString(); | |
} | |
@Override | |
public void serializeAsField(Object pojo, JsonGenerator gen, SerializerProvider provider, PropertyWriter writer) | |
throws Exception { | |
String path = createPath(writer, gen); | |
if (includes.contains(path)) { | |
writer.serializeAsField(pojo, gen, provider); | |
} else { | |
writer.serializeAsOmittedField(pojo, gen, provider); | |
} | |
} | |
} | |
} |
@sdorra Under which license are you publishing these code snippets?
Are the snippets free to use (something like MIT license) or how should I attribute you, when I use your snippets?
Most of my OSS Code is published under the MIT License. Feel free to use this code for what ever you like. I don't know if i can set a license for a gist.
@sdorra Under which license are you publishing these code snippets?
Are the snippets free to use (something like MIT license) or how should I attribute you, when I use your snippets?Most of my OSS Code is published under the MIT License. Feel free to use this code for what ever you like. I don't know if i can set a license for a gist.
Thank you.
I have seen a few gists where there is an additional field named LICENSE
.
Or you can also create an extra gist like https://gist.github.com/martinbuberl/c0de29e623a1e34d1cda7e817d18bafe.
@sdorra Under which license are you publishing these code snippets?
Are the snippets free to use (something like MIT license) or how should I attribute you, when I use your snippets?