Skip to content

Commit 9e64875

Browse files
authored
Add extension jackson-jr-extension-javatime to support (some) Java 8 date/time types
2 parents 11d0611 + 36f90ca commit 9e64875

File tree

13 files changed

+285
-0
lines changed

13 files changed

+285
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ Project is composed of multiple Maven sub-modules, each corresponding to a jar:
4040
* [jr-retrofit2](../../tree/master/jr-retrofit2) contains `jackson-jr` - based handlers for [Retrofit 2](https://square.github.io/retrofit/) library
4141
* Depends on `jackson-jr` and `Retrofit` API jars, and indirectly on `jackson-core`
4242
* [jr-annotation-support](../../tree/master/jr-annotation-support) contains extension with support for a subset of core [Jackson annotations](../../../jackson-annotations)
43+
* [jr-extension-javatime](../../tree/master/jr-extension-javatime) contains extension with support for a subset of Java 8 Date/Time types (e.g. `LocalDateTime`)
4344
* jr-all creates an "uber-jar" that contains individual modules along with all their dependencies:
4445
* `jr-objects` classes as-is, without relocating
4546
* `jr-stree` classes as-is, without relocating

jr-extension-javatime/README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
## Overview
2+
3+
This module extends the functionality of jackson-jr by adding support for (a subset of) Java 8 Date/Time types (value types in JDK `java.time` package).
4+
5+
### Status
6+
7+
Added in Jackson 2.17.
8+
9+
### Usage
10+
To be able to use supported annotations, you need to register extension like so:
11+
```java
12+
private static final JSON JACKSON = JSON.builder()
13+
.register(new JacksonJrJavaTimeExtension())
14+
.build();
15+
```
16+
after which you can use normal read and write operations as usual:
17+
18+
```java
19+
import java.time.LocalDateTime;
20+
21+
public class Application {
22+
public static void main(String[] args) {
23+
final LocalDateTime now = LocalDateTime.now();
24+
MyClass myObject = new MyClass(now, 'Some Other Values....');
25+
String myObjectJsonString = JACKSON.asString(myObject);
26+
MyClass myObjectFromJson = JACKSON.beanFrom(MyClass, myObjectJsonString);
27+
assert myObjectFromJson.getTime().equals(now);
28+
}
29+
}
30+
31+
// ...
32+
33+
public class MyClass {
34+
private LocalDateTime time;
35+
private String otherItems;
36+
37+
public MyClass(LocalDateTime datetime, String others) {
38+
//...
39+
}
40+
41+
public LocalDateTime getTime() {
42+
return time;
43+
}
44+
// other getters & setters
45+
}
46+
```
47+
48+
### Date Classes currently supported by `JacksonJrJavaTimeExtension`
49+
50+
- `java.util.LocalDateTime`
51+
52+
### Plans for Future
53+
54+
- Add support for other Java 8 Date/Time types

jr-extension-javatime/pom.xml

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
2+
<!-- This module was also published with a richer model, Gradle metadata, -->
3+
<!-- which should be used instead. Do not delete the following line which -->
4+
<!-- is to indicate to Gradle or any Gradle module metadata file consumer -->
5+
<!-- that they should prefer consuming it instead. -->
6+
<!-- do_not_remove: published-with-gradle-metadata -->
7+
<modelVersion>4.0.0</modelVersion>
8+
9+
<parent>
10+
<groupId>com.fasterxml.jackson.jr</groupId>
11+
<artifactId>jackson-jr-parent</artifactId>
12+
<version>2.17.0-rc1-SNAPSHOT</version>
13+
</parent>
14+
15+
<artifactId>jackson-jr-extension-javatime</artifactId>
16+
<packaging>bundle</packaging>
17+
<description>Jackson-jr extension that adds support for Java 8 Date/Time value types such as `java.util.LocalDateTime`</description>
18+
<url>https://github.com/FasterXML/jackson-jr</url>
19+
20+
<licenses>
21+
<license>
22+
<name>The Apache Software License, Version 2.0</name>
23+
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
24+
<distribution>repo</distribution>
25+
</license>
26+
</licenses>
27+
28+
<properties>
29+
<!-- Looks like we need to be bit careful on OSGi exports, to avoid
30+
accidentally double-exporting jr-objects types
31+
-->
32+
<osgi.export>${project.groupId}.extension.javatime;version=${project.version}</osgi.export>
33+
34+
<!-- for Reproducible Builds -->
35+
<project.build.outputTimestamp>2023-11-15T22:39:39Z</project.build.outputTimestamp>
36+
</properties>
37+
38+
<dependencies>
39+
<dependency>
40+
<groupId>com.fasterxml.jackson.jr</groupId>
41+
<artifactId>jackson-jr-objects</artifactId>
42+
<version>${project.version}</version>
43+
</dependency>
44+
</dependencies>
45+
46+
<build>
47+
<plugins>
48+
<plugin>
49+
<groupId>org.apache.maven.plugins</groupId>
50+
<artifactId>maven-surefire-plugin</artifactId>
51+
<configuration>
52+
<redirectTestOutputToFile>${surefire.redirectTestOutputToFile}</redirectTestOutputToFile>
53+
<excludes>
54+
<exclude>**/failing/*.java</exclude>
55+
</excludes>
56+
</configuration>
57+
</plugin>
58+
<!-- 11-Mar-2019, tatu: Add basic JDK8-includable module-info, generated by Moditect -->
59+
<plugin>
60+
<groupId>org.moditect</groupId>
61+
<artifactId>moditect-maven-plugin</artifactId>
62+
</plugin>
63+
<!-- 05-Jul-2020, tatu: Add generation of Gradle Module Metadata -->
64+
<plugin>
65+
<groupId>de.jjohannes</groupId>
66+
<artifactId>gradle-module-metadata-maven-plugin</artifactId>
67+
</plugin>
68+
</plugins>
69+
</build>
70+
71+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.fasterxml.jackson.jr.extension.javatime;
2+
3+
import com.fasterxml.jackson.jr.ob.JacksonJrExtension;
4+
import com.fasterxml.jackson.jr.ob.api.ExtensionContext;
5+
6+
public class JacksonJrJavaTimeExtension extends JacksonJrExtension {
7+
final static JavaTimeReaderWriterProvider DEFAULT_RW_PROVIDER = new JavaTimeReaderWriterProvider();
8+
9+
private JavaTimeReaderWriterProvider readerWriterProvider = DEFAULT_RW_PROVIDER;
10+
11+
@Override
12+
protected void register(ExtensionContext ctxt) {
13+
ctxt.insertProvider(readerWriterProvider);
14+
}
15+
16+
public JacksonJrJavaTimeExtension with(JavaTimeReaderWriterProvider p) {
17+
readerWriterProvider = p;
18+
return this;
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.fasterxml.jackson.jr.extension.javatime;
2+
3+
import com.fasterxml.jackson.jr.ob.api.ReaderWriterProvider;
4+
import com.fasterxml.jackson.jr.ob.api.ValueReader;
5+
import com.fasterxml.jackson.jr.ob.api.ValueWriter;
6+
import com.fasterxml.jackson.jr.ob.impl.JSONReader;
7+
import com.fasterxml.jackson.jr.ob.impl.JSONWriter;
8+
9+
import java.time.LocalDateTime;
10+
import java.time.format.DateTimeFormatter;
11+
12+
/**
13+
* Provider for {@link ValueReader}s and {@link ValueWriter}s for Date/Time
14+
* types supported by Java Time Extension.
15+
*/
16+
public class JavaTimeReaderWriterProvider extends ReaderWriterProvider
17+
{
18+
private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
19+
20+
public JavaTimeReaderWriterProvider() { }
21+
22+
@Override
23+
public ValueReader findValueReader(JSONReader readContext, Class<?> type) {
24+
return LocalDateTime.class.isAssignableFrom(type) ? new LocalDateTimeValueReader(dateTimeFormatter) : null;
25+
}
26+
27+
@Override
28+
public ValueWriter findValueWriter(JSONWriter writeContext, Class<?> type) {
29+
return LocalDateTime.class.isAssignableFrom(type) ? new LocalDateTimeValueWriter(dateTimeFormatter) : null;
30+
}
31+
32+
/**
33+
* Method for reconfiguring {@link DateTimeFormatter} used for reading/writing
34+
* following Date/Time value types:
35+
*<ul>
36+
* <li>{@code java.time.LocalDateTime}
37+
* </li>
38+
*</ul>
39+
*
40+
* @param formatter
41+
*
42+
* @return This provider instance for call chaining
43+
*/
44+
public JavaTimeReaderWriterProvider withDateTimeFormatter(DateTimeFormatter formatter) {
45+
dateTimeFormatter = formatter;
46+
return this;
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.fasterxml.jackson.jr.extension.javatime;
2+
3+
import com.fasterxml.jackson.core.JsonParser;
4+
import com.fasterxml.jackson.jr.ob.api.ValueReader;
5+
import com.fasterxml.jackson.jr.ob.impl.JSONReader;
6+
7+
import java.io.IOException;
8+
import java.time.LocalDateTime;
9+
import java.time.format.DateTimeFormatter;
10+
11+
public class LocalDateTimeValueReader extends ValueReader {
12+
private final DateTimeFormatter formatter;
13+
14+
public LocalDateTimeValueReader(DateTimeFormatter formatter) {
15+
super(LocalDateTime.class);
16+
this.formatter = formatter;
17+
}
18+
19+
@Override
20+
public Object read(JSONReader reader, JsonParser p) throws IOException {
21+
return LocalDateTime.parse(p.getText(), formatter);
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.fasterxml.jackson.jr.extension.javatime;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.jr.ob.api.ValueWriter;
5+
import com.fasterxml.jackson.jr.ob.impl.JSONWriter;
6+
7+
import java.io.IOException;
8+
import java.time.LocalDateTime;
9+
import java.time.format.DateTimeFormatter;
10+
11+
public class LocalDateTimeValueWriter implements ValueWriter {
12+
private final DateTimeFormatter formatter;
13+
14+
public LocalDateTimeValueWriter(DateTimeFormatter formatter) {
15+
this.formatter = formatter;
16+
}
17+
18+
@Override
19+
public void writeValue(JSONWriter context, JsonGenerator g, Object value) throws IOException {
20+
String localDateTimeString = ((LocalDateTime) value).format(formatter);
21+
context.writeValue(localDateTimeString);
22+
}
23+
24+
@Override
25+
public Class<?> valueType() {
26+
return LocalDateTime.class;
27+
}
28+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
This copy of Jackson-jr library is licensed under the
2+
Apache (Software) License, version 2.0 ("the License").
3+
See the License for details about distribution rights, and the
4+
specific rights regarding derivative works.
5+
6+
You may obtain a copy of the License at:
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Jackson JSON processor
2+
3+
Jackson is a high-performance, Free/Open Source JSON processing library.
4+
It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
5+
been in development since 2007.
6+
It is currently developed by a community of developers.
7+
8+
## Licensing
9+
10+
Jackson components are licensed under Apache (Software) License, version 2.0,
11+
as per accompanying LICENSE file.
12+
13+
## Credits
14+
15+
A list of contributors may be found from CREDITS file, which is included
16+
in some artifacts (usually source distributions); but is always available
17+
from the source code management (SCM) system project uses.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module com.fasterxml.jackson.jr.extension.javatime {
2+
requires com.fasterxml.jackson.core;
3+
requires com.fasterxml.jackson.jr.ob;
4+
5+
exports com.fasterxml.jackson.jr.extension.javatime;
6+
}

0 commit comments

Comments
 (0)