<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.fam-hammann.de/index.php?action=history&amp;feed=atom&amp;title=Jackson</id>
	<title>Jackson - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.fam-hammann.de/index.php?action=history&amp;feed=atom&amp;title=Jackson"/>
	<link rel="alternate" type="text/html" href="https://wiki.fam-hammann.de/index.php?title=Jackson&amp;action=history"/>
	<updated>2026-04-10T12:35:52Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wiki - Jochen Hammann</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://wiki.fam-hammann.de/index.php?title=Jackson&amp;diff=39&amp;oldid=prev</id>
		<title>Jochen: Die Seite wurde neu angelegt: „__TOC__   == Implementierung eines TypeIdResolver ==  Der folgende Code-Ausschnitt zeigt die Implementierung eines &lt;code&gt;TypeIdResolver&lt;/code&gt;.  &lt;syntaxhighlig…“</title>
		<link rel="alternate" type="text/html" href="https://wiki.fam-hammann.de/index.php?title=Jackson&amp;diff=39&amp;oldid=prev"/>
		<updated>2016-09-29T07:09:58Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „__TOC__   == Implementierung eines TypeIdResolver ==  Der folgende Code-Ausschnitt zeigt die Implementierung eines &amp;lt;code&amp;gt;TypeIdResolver&amp;lt;/code&amp;gt;.  &amp;lt;syntaxhighlig…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementierung eines TypeIdResolver ==&lt;br /&gt;
&lt;br /&gt;
Der folgende Code-Ausschnitt zeigt die Implementierung eines &amp;lt;code&amp;gt;TypeIdResolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class MyTypeIdResolver implements TypeIdResolver&lt;br /&gt;
{&lt;br /&gt;
    // ============================== [Fields] ==============================&lt;br /&gt;
    // -------------------- [Private Fields] --------------------&lt;br /&gt;
    private JavaType baseType;&lt;br /&gt;
    // ============================== [Getter/Setter] ==============================&lt;br /&gt;
    // -------------------- [Public Getter/Setter] --------------------&lt;br /&gt;
    @Override&lt;br /&gt;
    public Id getMechanism()&lt;br /&gt;
    {&lt;br /&gt;
        return Id.CUSTOM;&lt;br /&gt;
    }&lt;br /&gt;
    // ============================== [Methods] ==============================&lt;br /&gt;
    // -------------------- [Public Methods] --------------------&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init(JavaType baseType)&lt;br /&gt;
    {&lt;br /&gt;
        this.baseType = baseType;&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public String idFromValue(Object value)&lt;br /&gt;
    {&lt;br /&gt;
        return idFromValueAndType(value, value.getClass());&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public String idFromValueAndType(Object value, Class&amp;lt;?&amp;gt; suggestedType)&lt;br /&gt;
    {&lt;br /&gt;
        return suggestedType.getName();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public String idFromBaseType()&lt;br /&gt;
    {&lt;br /&gt;
        return idFromValueAndType(null, this.baseType.getClass());&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public JavaType typeFromId(String id)&lt;br /&gt;
    {&lt;br /&gt;
        Class&amp;lt;?&amp;gt; resolvedClass = null;&lt;br /&gt;
        &lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            resolvedClass = ClassUtil.findClass(id);&lt;br /&gt;
        }&lt;br /&gt;
        catch (ClassNotFoundException e)&lt;br /&gt;
        {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        return TypeFactory.defaultInstance().constructSpecializedType(this.baseType, resolvedClass);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die entsprechende (Basis-)Klasse muss folgende Annotations spezifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@JsonTypeInfo(use = JsonTypeInfo.Id.CUSTOM, include = JsonTypeInfo.As.PROPERTY, property = &amp;quot;type&amp;quot;)&lt;br /&gt;
@JsonTypeIdResolver(MyTypeIdResolver.class)&lt;br /&gt;
public abstract class AnalysisIntervalViewModel implements ViewModel&lt;br /&gt;
{&lt;br /&gt;
    ...    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementierung eines Custom-Serializers ==&lt;br /&gt;
&lt;br /&gt;
Der folgende Code-Ausschnitt zeigt die Implementierung eines Custom-Serializers. Die Registrierung eines Serializers erfolgt über einen Context Resolver (siehe unten).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class AppZonedDateTimeSerializer extends JsonSerializer&amp;lt;AppZonedDateTime&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    // ============================== [Methods] ==============================&lt;br /&gt;
    // -------------------- [Public Methods] --------------------&lt;br /&gt;
    /*&lt;br /&gt;
     * (non-Javadoc)&lt;br /&gt;
     * &lt;br /&gt;
     * @see com.fasterxml.jackson.databind.JsonSerializer#serialize(java.lang.Object,&lt;br /&gt;
     * com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider)&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    public void serialize(AppZonedDateTime value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException&lt;br /&gt;
    {&lt;br /&gt;
        jgen.writeStartObject();&lt;br /&gt;
        jgen.writeStringField(&amp;quot;isoDateTime&amp;quot;, value.getIsoDateTime());&lt;br /&gt;
        jgen.writeStringField(&amp;quot;timeZoneIdTzDb&amp;quot;, value.getTimeZoneIdTzDb());&lt;br /&gt;
        jgen.writeEndObject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementierung eines Custom-Deserializers ==&lt;br /&gt;
&lt;br /&gt;
Der folgende Code-Ausschnitt zeigt die Implementierung eines Custom-Deserializers. Die Registrierung eines Deserializers erfolgt über einen Context Resolver (siehe unten).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class AppZonedDateTimeDeserializer extends JsonDeserializer&amp;lt;AppZonedDateTime&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    // ============================== [Methods] ==============================&lt;br /&gt;
    // -------------------- [Public Methods] --------------------&lt;br /&gt;
    /*&lt;br /&gt;
     * (non-Javadoc)&lt;br /&gt;
     * &lt;br /&gt;
     * @see&lt;br /&gt;
     * com.fasterxml.jackson.databind.JsonDeserializer#deserialize(com.fasterxml.jackson.core.JsonParser&lt;br /&gt;
     * , com.fasterxml.jackson.databind.DeserializationContext)&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    public AppZonedDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException&lt;br /&gt;
    {&lt;br /&gt;
        JsonNode node = jp.getCodec().readTree(jp);&lt;br /&gt;
        String isoDateTime = node.get(&amp;quot;isoDateTime&amp;quot;).asText();&lt;br /&gt;
        String timeZone = node.get(&amp;quot;timeZoneIdTzDb&amp;quot;).asText();&lt;br /&gt;
        return new AppZonedDateTime(&amp;quot;N/A&amp;quot;, isoDateTime, timeZone);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementierung eines ContextResolver bzw. Object Mapper Provider ==&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe eines Context Resolvers bzw. Object Mapper Provider ist es möglich Serializer und Deserializer im Jackson Framework zu registrieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Provider&lt;br /&gt;
public class MyObjectMapperProvider implements ContextResolver&amp;lt;ObjectMapper&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    // ============================== [Fields] ==============================&lt;br /&gt;
    // -------------------- [Private Fields] --------------------&lt;br /&gt;
    private final ObjectMapper defaultObjectMapper;&lt;br /&gt;
    // ============================== [Construction / Destruction] ==============================&lt;br /&gt;
    // -------------------- [Public Construction / Destruction] --------------------&lt;br /&gt;
    public MyObjectMapperProvider()&lt;br /&gt;
    {&lt;br /&gt;
         SimpleModule module = new SimpleModule();&lt;br /&gt;
         module.addDeserializer(AppZonedDateTime.class, new AppZonedDateTimeDeserializer());&lt;br /&gt;
         module.addSerializer(AppZonedDateTime.class, new AppZonedDateTimeSerializer());&lt;br /&gt;
        &lt;br /&gt;
         this.defaultObjectMapper = new ObjectMapper();&lt;br /&gt;
         this.defaultObjectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);&lt;br /&gt;
//         this.defaultObjectMapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);&lt;br /&gt;
//         this.defaultObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);&lt;br /&gt;
         this.defaultObjectMapper.registerModule(module);&lt;br /&gt;
    }&lt;br /&gt;
    // ============================== [Getter/Setter] ==============================&lt;br /&gt;
    // -------------------- [Public Getter/Setter] --------------------&lt;br /&gt;
    @Override&lt;br /&gt;
    public ObjectMapper getContext(Class&amp;lt;?&amp;gt; type)&lt;br /&gt;
    {&lt;br /&gt;
        return defaultObjectMapper;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== @JsonTypeInfo und @JsonSubTypes ==&lt;br /&gt;
&lt;br /&gt;
An Beispielen soll die Verwendung der Annotations &amp;lt;code&amp;gt;@JsonTypeInfo&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;@JsonSubTypes&amp;lt;/code&amp;gt; veranschaulicht werden.&lt;br /&gt;
Der folgende Code-Ausschnitt wurde verwendet, JSON mit abgeleiteten Datentypen zwischen Java (Jersey inkl. Jackson) und .NET (WCF) auszutauschen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = &amp;quot;__type&amp;quot;)&lt;br /&gt;
@JsonSubTypes({ @Type(value = DayViewModel.class, name = &amp;quot;DayStatic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = WeekViewModel.class, name = &amp;quot;WeekStatic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = MonthViewModel.class, name = &amp;quot;MonthStatic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = QuarterViewModel.class, name = &amp;quot;QuarterStatic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = YearViewModel.class, name = &amp;quot;YearStatic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = CustomIntervalViewModel.class, name = &amp;quot;CustomStatic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = TodayViewModel.class, name = &amp;quot;TodayDynamic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = YesterdayViewModel.class, name = &amp;quot;YesterdayDynamic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = CurrentWeekViewModel.class, name = &amp;quot;CurrentWeekDynamic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = LastWeekViewModel.class, name = &amp;quot;LastWeekDynamic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = CurrentMonthViewModel.class, name = &amp;quot;CurrentMonthDynamic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = LastMonthViewModel.class, name = &amp;quot;LastMonthDynamic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = CurrentQuarterViewModel.class, name = &amp;quot;CurrentQuarterDynamic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = LastQuarterViewModel.class, name = &amp;quot;LastQuarterDynamic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = CurrentYearViewModel.class, name = &amp;quot;CurrentYearDynamic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = LastYearViewModel.class, name = &amp;quot;LastYearDynamic:#Servicetrace.Reporting&amp;quot;),&lt;br /&gt;
    @Type(value = LastHoursViewModel.class, name = &amp;quot;LastHoursDynamic:#Servicetrace.Reporting&amp;quot;) })&lt;br /&gt;
public abstract class AnalysisIntervalViewModel implements ViewModel&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der folgende Code-Ausschnitt wurde verwendet, JSON mit abgeleiteten Datentypen zwischen einem Java Client und Java Server (jeweils Jersey inkl. Jackson) auszutauschen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@JsonTypeInfo(use = Id.CLASS, include = As.PROPERTY, property = &amp;quot;@class&amp;quot;)&lt;br /&gt;
public abstract class AnalysisConfigViewModel implements ViewModel&lt;br /&gt;
{&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jochen</name></author>
	</entry>
</feed>