diff --git a/client/jackson/build.gradle b/client/jackson/build.gradle index ea9d24b501..a895476683 100644 --- a/client/jackson/build.gradle +++ b/client/jackson/build.gradle @@ -14,6 +14,13 @@ repositories { dependencies { compile project(':core') compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - compile ("com.fasterxml.jackson.module:jackson-module-kotlin:${jackson_version}") + + // Jackson and its plugins: parsing to/from JSON and other textual formats. + compile "com.fasterxml.jackson.module:jackson-module-kotlin:${jackson_version}" + // Yaml is useful for parsing strings to method calls. + compile "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:$jackson_version" + // This adds support for java.time types. + compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jackson_version" + testCompile "junit:junit:$junit_version" } diff --git a/client/jackson/src/main/kotlin/net/corda/jackson/JacksonSupport.kt b/client/jackson/src/main/kotlin/net/corda/jackson/JacksonSupport.kt index 5cbfb70423..dd6734ecd4 100644 --- a/client/jackson/src/main/kotlin/net/corda/jackson/JacksonSupport.kt +++ b/client/jackson/src/main/kotlin/net/corda/jackson/JacksonSupport.kt @@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.* import com.fasterxml.jackson.databind.deser.std.NumberDeserializers import com.fasterxml.jackson.databind.deser.std.StringArrayDeserializer import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import com.fasterxml.jackson.module.kotlin.KotlinModule import net.corda.core.contracts.BusinessCalendar import net.corda.core.crypto.* @@ -18,8 +19,6 @@ import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize import net.i2p.crypto.eddsa.EdDSAPublicKey import java.math.BigDecimal -import java.time.LocalDate -import java.time.LocalDateTime /** * Utilities and serialisers for working with JSON representations of basic types. This adds Jackson support for @@ -48,15 +47,6 @@ object JacksonSupport { override fun partyFromKey(owningKey: CompositeKey): Party? = throw UnsupportedOperationException() } - val javaTimeModule: Module by lazy { - SimpleModule("java.time").apply { - addSerializer(LocalDate::class.java, ToStringSerializer) - addDeserializer(LocalDate::class.java, LocalDateDeserializer) - addKeyDeserializer(LocalDate::class.java, LocalDateKeyDeserializer) - addSerializer(LocalDateTime::class.java, ToStringSerializer) - } - } - val cordaModule: Module by lazy { SimpleModule("core").apply { addSerializer(AnonymousParty::class.java, AnonymousPartySerializer) @@ -66,9 +56,7 @@ object JacksonSupport { addSerializer(BigDecimal::class.java, ToStringSerializer) addDeserializer(BigDecimal::class.java, NumberDeserializers.BigDecimalDeserializer()) addSerializer(SecureHash::class.java, SecureHashSerializer) - // It's slightly remarkable, but apparently Jackson works out that this is the only possibility - // for a SecureHash at the moment and tries to use SHA256 directly even though we only give it SecureHash - addDeserializer(SecureHash.SHA256::class.java, SecureHashDeserializer()) + addDeserializer(SecureHash::class.java, SecureHashDeserializer()) addDeserializer(BusinessCalendar::class.java, CalendarDeserializer) // For ed25519 pubkeys @@ -103,7 +91,7 @@ object JacksonSupport { enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS) - registerModule(javaTimeModule) + registerModule(JavaTimeModule()) registerModule(cordaModule) registerModule(KotlinModule()) } @@ -114,23 +102,6 @@ object JacksonSupport { } } - object LocalDateDeserializer : JsonDeserializer() { - override fun deserialize(parser: JsonParser, context: DeserializationContext): LocalDate { - return try { - LocalDate.parse(parser.text) - } catch (e: Exception) { - throw JsonParseException(parser, "Invalid LocalDate ${parser.text}: ${e.message}") - } - } - } - - object LocalDateKeyDeserializer : KeyDeserializer() { - override fun deserializeKey(text: String, p1: DeserializationContext): Any? { - return LocalDate.parse(text) - } - - } - object AnonymousPartySerializer : JsonSerializer() { override fun serialize(obj: AnonymousParty, generator: JsonGenerator, provider: SerializerProvider) { generator.writeString(obj.owningKey.toBase58String())