/*
* (c) Copyright Reserved EVRYTHNG Limited 2016. All rights reserved.
* Use of this material is subject to license.
* Copying and unauthorised use of this material strictly prohibited.
*/
package com.evrythng.java.wrapper.util;
import com.evrythng.java.wrapper.exception.WrappedRuntimeException;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import com.fasterxml.jackson.databind.deser.std.StringDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.util.ISO8601DateFormat;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.io.InputStream;
/**
* JSON utilities based on Jackson {@link ObjectMapper}.
*/
public final class JSONUtils {
/**
* ObjectMapper singleton.
*/
public static final ObjectMapper OBJECT_MAPPER = createObjectMapper();
private JSONUtils() {
/* Hide default constructor */
}
/**
* Deserializes the provided {@code json} {@link String} to a native {@code type} representation.
*
* @return Deserialized native instance
*
* @deprecated since 1.15
*/
@Deprecated
public static <T> T read(final String json, final Class<T> type) {
try {
return OBJECT_MAPPER.readValue(json, type);
} catch (Exception e) {
// Wrap into unchecked exception:
throw new WrappedRuntimeException(e);
}
}
/**
* Deserializes the provided {@code json} {@link String} to a native {@code type} representation.
*
* @return Deserialized native instance
*/
public static <T> T read(final String json, final TypeReference<T> type) {
try {
return OBJECT_MAPPER.readValue(json, type);
} catch (Exception e) {
// Wrap into unchecked exception:
throw new WrappedRuntimeException(e);
}
}
/**
* Deserializes the provided {@link InputStream} to a native {@code type} representation.
*
* @return Deserialized native instance
*
* @deprecated since 1.15
*/
@Deprecated
public static <T> T read(final InputStream inputStream, final TypeReference<T> type) {
try {
return OBJECT_MAPPER.readValue(inputStream, type);
} catch (Exception e) {
// Wrap into unchecked exception:
throw new WrappedRuntimeException(e);
}
}
/**
* Deserializes the provided {@link InputStream} to a native {@code valueType} representation.
*
* @return Deserialized native instance
*
* @deprecated since 1.15
*/
@Deprecated
public static <T> T read(final InputStream inputStream, final Class<T> valueType) {
try {
return OBJECT_MAPPER.readValue(inputStream, valueType);
} catch (Exception e) {
// Wrap into unchecked exception:
throw new WrappedRuntimeException(e);
}
}
/**
* Converts the provided {@code object} to an JSON {@link String}.
*/
public static String write(final Object object) {
try {
return OBJECT_MAPPER.writeValueAsString(object);
} catch (Exception e) {
// Wrap into unchecked exception:
throw new WrappedRuntimeException(e);
}
}
/**
* Creates a pre-configured {@link ObjectMapper}.
*/
public static ObjectMapper createObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.setDateFormat(new ISO8601DateFormat());
mapper.registerModule(new CoreModule());
return mapper;
}
private static class CoreModule extends SimpleModule {
private CoreModule() {
addDeserializer(String.class, new StdScalarDeserializer<String>(String.class) {
private static final long serialVersionUID = 6977627268309308664L;
private final StringDeserializer STRING_DESERIALIZER = new StringDeserializer();
@Override
public String deserialize(final JsonParser jp, final DeserializationContext ctx) throws IOException {
return StringUtils.trim(STRING_DESERIALIZER.deserialize(jp, ctx));
}
});
}
}
}