2 Replies Latest reply on Jan 14, 2019 9:46 AM by Gerrit Hohl

    WildFly 15: Deserialize / serialize LocalDateTime as number

    Gerrit Hohl Newbie

      Hello everyone,

       

      in the following thread there is a discussion how to enable the behaviour, that JSON-B returns e.g. LocalDateTime as a timestamp in milliseconds:

      Resteasy exports dates in textual format on wildfly 14 (Java 11) as opposed to numeric format in wildfly 9 (Java 8)

      That works fine - with one downside: Before such values were returned as numbers, but now they are returned as strings.

       

      Is there any possibility to configure the JSON-B in a way that it returns such objects as numbers?

       

      My code:

      import javax.json.bind.Jsonb;
      import javax.json.bind.JsonbBuilder;
      import javax.json.bind.JsonbConfig;
      import javax.json.bind.annotation.JsonbDateFormat;
      import javax.ws.rs.Produces;
      import javax.ws.rs.core.MediaType;
      import javax.ws.rs.ext.ContextResolver;
      import javax.ws.rs.ext.Provider;
      
      import org.jboss.logging.Logger;
      
      @Provider
      @Produces(MediaType.APPLICATION_JSON)
      public class JsonbContextResolver implements ContextResolver {
      
      
          /** The logging. */
          private static Logger log = Logger.getLogger(JsonbContextResolver.class);
      
      
          private Jsonb         jsonB;
      
      
          public JsonbContextResolver() {
              super();
      
              this.initialize();
          }
      
      
          private void initialize() {
              JsonbConfig config;
      
      
              log.info("Created " + this.getClass().getSimpleName());
              config = new JsonbConfig();
              config.setProperty(JsonbConfig.DATE_FORMAT, JsonbDateFormat.TIME_IN_MILLIS);
              this.jsonB = JsonbBuilder.create(config);
          }
      
      
          @Override
          public Jsonb getContext(Class type) {
              log.info("Retrieved object class: " + type.toGenericString());
              return this.jsonB;
          }
      
      
      }
        • 1. Re: WildFly 15: Deserialize / serialize LocalDateTime as number
          Gerrit Hohl Newbie

          I went into the depths of JSON-B and Yasson. And I landed at the class org.eclipse.yasson.internal.serializer.LocalDateTimeTypeSerializer which is in charge of serialization and deserialization of LocalDateTime objects.  It inherits from org.eclipse.yasson.internal.serializer.AbstractDateTimeSerializer and returns a String. Using that org.glassfish.json.JSonGeneratorImpl#write(String) is called. And that method escapes the String with double quotes.

           

          Seems it is not an easy task which can't be done just be changing the configuration, doesn't it?

          • 2. Re: WildFly 15: Deserialize / serialize LocalDateTime as number
            Gerrit Hohl Newbie

            I found a solution here: http://json-b.net/users-guide.html

            I simply wrote a serializer which implements JsonbSerializer and JsonbDeserializer and added it to the JsonbConfig with "withSerializers" and "withDeserializers".

             

            Maybe one thing to add: The interfaces must be declared on the class of the object you pass to the JsonbConfig. I tried to implement an AbstractSerializer<T> implementing these 2 interfaces and it got confused because it couldn't handle the generics.