Skip to main content

Serlizing JSON polymorphically when type field is in parent JSON using Jackson

Today, I came across a json parsing situation where the sub-type field is outside the type json. Genrally we seen a situation like this

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
class Animal{}

class Dog extends Animal{}

class Cat extends Animal{}

and it de-serialize to json like this:

    "@class" : "x.y.z.Cat", ...
}

In my project I need to parse json like this
{
"status": "OK",
"messageName": "x.y.z.Success",
"messagePayload": {
"foo": "cd3a5697",
"bar": 224
}
}
{
"status": "ERROR",
"messageName": "x.y.z.Error",
"messagePayload": {
"errorCode": "APPLICATION_ERROR",
"errorInstanceId": "b292b864",
"errorDetailedMessage": "Invalid UUID string (Length mismatch)"
}
}

Now only thing that differs here is the messagePayload and the property that makes it different is either messageName or status. I googled this kind of json serializing problem but didn't get the expected results. All results gave example shown in above Animal class.

How I solved it - well its very simple trick that strike me next day. I was trying the make @JsonTypeInfo on messagePayload, which is not working as sub-type field is outside the payload json. When I used the @JsonTypeInfo on whole message it works:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.EXTERNAL_PROPERTY, property = "messageName")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Success.class, name = "x.y.z.Success"),
    @JsonSubTypes.Type(value = Error.class, name = "x.y.z.Error")})
public abstract class Response {
    private String status;
    public abstract Payload getMessagePayload();
}

public abstract class Payload {}

public class SuccessPayload extends Payload {
    private String foo;
    private Long bar;
}

public class ErrorPayload extends Payload {
    private String errorCode;
    private String errorInstanceId;
    private String errorDetailedMessage;
}

Now using this I get the correct serialized payload depending upon the message class am getting in json. hope this helps.

Comments

Popular posts from this blog

Installing i3lock-color on Ubuntu

i3lock is fancy lock screen for Linux. There is i3lock dep available on Ubuntu but its not what I was looking for; I was more interested in i3lock-color . Lets see how we can install the same on ubuntu. PS: I'm using Ubuntu 16.04 Get source code for i3lock-color $ git clone https://github.com/PandorasFox/i3lock-color.git  $ cd i3lock-color Install required packages to build i3lock  $ apt install libev-dev $ apt install libxcb-composite0 libxcb-composite0-dev libxcb-xinerama0 libxcb-randr0  $ apt install libxcb-xinerama0-dev  $ apt install libxcb-xkb-dev  $ apt install libxcb-image0-dev  $ apt install libxcb-util-dev $ apt install libxkbcommon-x11-dev $ apt install libjpeg-turbo8-dev  $ apt install libpam0g-dev Build  $ autoreconf -i && ./configure && make Execute $ ./lock.sh Assign Shortcut In order to assign shortcut, install compizconfig $ sudo apt-get install compizconfig-settings-manager co...

GlassFish V3 admin console taking too much time to load.

If you have installed Glassfish V3 and trying to load admin console, but after signing in, is it taking too much time to get to the main page ? Do you have server.log entry like this: admin console: initSessionAttributes() Cannot refresh Catalog : Connection timed out then its time to tweak some files. Here its how: 1. Update the %GLASSFISH_HOME/glassfish/domains/domain1/domain.xml -Dcom.sun.enterprise.tools.admingui.NO_NETWORK=true This will block up the News item, the registration item, etc 2. Remove update tool jar (Backup and remove this JAR) %GLASSFISH_HOME/glassfish/modules/console-updatecenter-plugin.jar Delete this dir: %GLASSFISH_HOME/glassfish/domains/domain1/osgi-cache %GLASSFISH_HOME/glassfish/domains/domain1/generated Now start the server (bin/asadmin start-domain) and you will see the admin console won't be hang up and take you directly to main page.

INTO OUTFILE query, How to modify & output null values ?

I tried one query (originally asked at JR) on MySQL which export the table data into a file, with a comma delimited field. The query is straight forward and replace the null column value by "\N" character, but when I want to replace that "\N" value by some other character like "0" or simple empty field like " ", its gets little tricky. Here is the base query SELECT Id, name, age FROM student INTO OUTFILE 'c:/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'; And it outputs like, 1, "sagar", 23 2, "anant", 24 Now suppose some 'name' fields are null, then it outputs like 1, "sagar", 23 2, \N, 24 Now to obtain my desired results, which replace this null (\N) values by empty string like, "", I tried out two solutions --1. Using CASE statement SELECT Id, CASE WHEN name IS NULL THEN '' ELSE name END AS NewName, age FROM s...