diff --git a/README.md b/README.md
index 80470ba8..aee3e75d 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ Key Features:
- Supports polymorphic types and complex object graphs
- Zero external dependencies (other than java-util)
- Fully compatible with both JPMS and OSGi environments
-- Lightweight (224K for json-io.jar, 405K for java-util)
+- Lightweight (237K for json-io.jar, 405K for java-util)
- Compatible with JDK 1.8 through JDK 23
- Extensive configuration options via ReadOptions and WriteOptions
- Featured on [json.org](http://json.org)
@@ -31,7 +31,7 @@ ___
To include in your project:
##### Gradle
```groovy
-implementation 'com.cedarsoftware:json-io:4.33.0'
+implementation 'com.cedarsoftware:json-io:4.34.0'
```
##### Maven
@@ -39,7 +39,7 @@ implementation 'com.cedarsoftware:json-io:4.33.0'
com.cedarsoftwarejson-io
- 4.33.0
+ 4.34.0
```
___
@@ -57,23 +57,23 @@ ___
>- [ ] **Java Package**: com.cedarsoftware.io
>- [ ] **Java**: JDK17+ (Class file 61 format, includes module-info.class - multi-release JAR)
>- [ ] **API**
- > - Static methods on [JsonIo](https://www.javadoc.io/doc/com.cedarsoftware/json-io/latest/com/cedarsoftware/io/JsonIo.html): [toJson()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonIo.html#toJson(java.lang.Object,com.cedarsoftware.io.WriteOptions)), [toObjects()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonIo.html#toObjects(java.lang.String,com.cedarsoftware.io.ReadOptions,java.lang.Class)), [formatJson()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonIo.html#formatJson(java.lang.String,com.cedarsoftware.io.ReadOptions,com.cedarsoftware.io.WriteOptions)), [deepCopy()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonIo.html#deepCopy(java.lang.Object,com.cedarsoftware.io.ReadOptions,com.cedarsoftware.io.WriteOptions))
+ > - Static methods on [JsonIo](https://www.javadoc.io/doc/com.cedarsoftware/json-io/latest/com/cedarsoftware/io/JsonIo.html): [toJson()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonIo.html#toJson(java.lang.Object,com.cedarsoftware.io.WriteOptions)), [toObjects()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonIo.html#toObjects(java.lang.String,com.cedarsoftware.io.ReadOptions,java.lang.Class)), [formatJson()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonIo.html#formatJson(java.lang.String,com.cedarsoftware.io.ReadOptions,com.cedarsoftware.io.WriteOptions)), [deepCopy()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonIo.html#deepCopy(java.lang.Object,com.cedarsoftware.io.ReadOptions,com.cedarsoftware.io.WriteOptions))
> - Use [ReadOptionsBuilder](/user-guide-readOptions.md) and [WriteOptionsBuilder](/user-guide-writeOptions.md) to configure `JsonIo`
-> - Use [JsonReader.ClassFactory](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonReader.ClassFactory.html) for difficult classes (hard to instantiate & fill)
-> - Use [JsonWriter.JsonClassWriter](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonWriter.JsonClassWriter.html) to customize the output JSON for a particular class
+> - Use [JsonReader.ClassFactory](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonReader.ClassFactory.html) for difficult classes (hard to instantiate & fill)
+> - Use [JsonWriter.JsonClassWriter](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonWriter.JsonClassWriter.html) to customize the output JSON for a particular class
>- [ ] Updates will be 5.1.0, 5.2.0, ...
->### 4.33.0 (current)
->- [ ] **Version**: [4.33.0](https://www.javadoc.io/doc/com.cedarsoftware/json-io/4.33.0/index.html)
+>### 4.34.0 (current)
+>- [ ] **Version**: [4.34.0](https://www.javadoc.io/doc/com.cedarsoftware/json-io/4.34.0/index.html)
>- [ ] **Bundling**: Both JPMS (Java Platform Module System) and OSGi (Open Service Gateway initiative)
>- [ ] **Maintained**: Fully
>- [ ] **Java Package**: com.cedarsoftware.io
>- [ ] **Java**: JDK1.8+ (Class file 52 format, includes module-info.class - multi-release JAR)
>- [ ] **API**
-> - Static methods on [JsonIo](https://www.javadoc.io/doc/com.cedarsoftware/json-io/latest/com/cedarsoftware/io/JsonIo.html): [toJson()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonIo.html#toJson(java.lang.Object,com.cedarsoftware.io.WriteOptions)), [toObjects()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonIo.html#toObjects(java.lang.String,com.cedarsoftware.io.ReadOptions,java.lang.Class)), [formatJson()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonIo.html#formatJson(java.lang.String,com.cedarsoftware.io.ReadOptions,com.cedarsoftware.io.WriteOptions)), [deepCopy()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonIo.html#deepCopy(java.lang.Object,com.cedarsoftware.io.ReadOptions,com.cedarsoftware.io.WriteOptions))
+> - Static methods on [JsonIo](https://www.javadoc.io/doc/com.cedarsoftware/json-io/latest/com/cedarsoftware/io/JsonIo.html): [toJson()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonIo.html#toJson(java.lang.Object,com.cedarsoftware.io.WriteOptions)), [toObjects()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonIo.html#toObjects(java.lang.String,com.cedarsoftware.io.ReadOptions,java.lang.Class)), [formatJson()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonIo.html#formatJson(java.lang.String,com.cedarsoftware.io.ReadOptions,com.cedarsoftware.io.WriteOptions)), [deepCopy()](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonIo.html#deepCopy(java.lang.Object,com.cedarsoftware.io.ReadOptions,com.cedarsoftware.io.WriteOptions))
> - Use [ReadOptionsBuilder](/user-guide-readOptions.md) and [WriteOptionsBuilder](/user-guide-writeOptions.md) to configure `JsonIo`
-> - Use [JsonReader.ClassFactory](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonReader.ClassFactory.html) for difficult classes (hard to instantiate & fill)
-> - Use [JsonWriter.JsonClassWriter](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.33.0/com/cedarsoftware/io/JsonWriter.JsonClassWriter.html) to customize the output JSON for a particular class
->- [ ] Updates will be 4.34.0, 4.35.0, ...
+> - Use [JsonReader.ClassFactory](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonReader.ClassFactory.html) for difficult classes (hard to instantiate & fill)
+> - Use [JsonWriter.JsonClassWriter](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.34.0/com/cedarsoftware/io/JsonWriter.JsonClassWriter.html) to customize the output JSON for a particular class
+>- [ ] Updates will be 4.35.0, 4.36.0, ...
>### 4.14.x (supported)
>- [ ] **Version**: [4.14.3](https://www.javadoc.io/doc/com.cedarsoftware/json-io/4.14.3/index.html)
>- [ ] **Bundling**: Both JPMS (Java Platform Module System) and OSGi (Open Service Gateway initiative)
diff --git a/changelog.md b/changelog.md
index 6c56e14b..bc30c51e 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,4 +1,6 @@
### Revision History
+#### 4.34.0
+ * Improved Date and java.sql.Date handling within Converters.
#### 4.33.0
* New custom `ClassFactory` classes are easier to write:
* See [examples](user-guide.md#classfactory-and-customwriter-examples)
diff --git a/pom.xml b/pom.xml
index 0f2d1699..403c2790 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
com.cedarsoftwarejson-iobundle
- 4.33.0
+ 4.34.0Java JSON serializationhttps://github.com/jdereg/json-io
@@ -26,8 +26,7 @@
yyyy-MM-dd'T'HH:mm:ss.SSSZUTF-8
-
- 3.0.2
+ 3.0.35.11.43.27.2
diff --git a/src/main/java/com/cedarsoftware/io/JsonIo.java b/src/main/java/com/cedarsoftware/io/JsonIo.java
index cfce943e..b9a3a392 100644
--- a/src/main/java/com/cedarsoftware/io/JsonIo.java
+++ b/src/main/java/com/cedarsoftware/io/JsonIo.java
@@ -3,7 +3,6 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
-import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
@@ -381,11 +380,8 @@ public static WriteOptionsBuilder getWriteOptionsBuilder(Map opt
WriteOptionsBuilder builder = new WriteOptionsBuilder();
Object dateFormat = optionalArgs.get(DATE_FORMAT);
- if (dateFormat instanceof String)
- {
- builder.dateTimeFormat((String) dateFormat);
- } else if (dateFormat instanceof SimpleDateFormat) {
- builder.dateTimeFormat(((SimpleDateFormat) dateFormat).toPattern());
+ if (dateFormat != null) {
+ builder.isoDateFormat();
}
Boolean showType = com.cedarsoftware.util.Converter.convert(optionalArgs.get(TYPE), Boolean.class);
diff --git a/src/main/java/com/cedarsoftware/io/WriteOptionsBuilder.java b/src/main/java/com/cedarsoftware/io/WriteOptionsBuilder.java
index 73b7b4be..db404e37 100644
--- a/src/main/java/com/cedarsoftware/io/WriteOptionsBuilder.java
+++ b/src/main/java/com/cedarsoftware/io/WriteOptionsBuilder.java
@@ -636,23 +636,14 @@ public WriteOptionsBuilder addExcludedFields(Map, Collection> e
}
/**
- * Change the date-time format to the ISO date format: "yyyy-MM-dd". This is for java.util.Data and
- * java.sql.Date.
+ * Change the date-time format to the ISO date format: "yyyy-MM-ddThh:mm:ss.SSSZ". This is for java.util.Date and
+ * java.sql.Date. The fractional sections are omitted if millis are 0.
*
* @return WriteOptionsBuilder for chained access.
*/
public WriteOptionsBuilder isoDateFormat() {
- return dateTimeFormat(ISO_DATE_FORMAT);
- }
-
- /**
- * Change the date-time format to the ISO date-time format: "yyyy-MM-dd'T'HH:mm:ss" (default). This is
- * for java.util.Date and java.sql.Date.
- *
- * @return WriteOptionsBuilder for chained access.
- */
- public WriteOptionsBuilder isoDateTimeFormat() {
- return dateTimeFormat(ISO_DATE_TIME_FORMAT);
+ addCustomWrittenClass(Date.class, new Writers.DateWriter());
+ return this;
}
/**
@@ -666,18 +657,6 @@ public WriteOptionsBuilder longDateFormat() {
addCustomWrittenClass(Date.class, new Writers.DateAsLongWriter());
return this;
}
-
- /**
- * Change the date-time format to the passed in format. The format pattens can be found in the Java Doc
- * for the java.time.format.DateTimeFormatter class. There are many constants you can use, as well as
- * the definition of how to construct your own patterns. This is for java.util.Date and java.sql.Date.
- *
- * @return WriteOptionsBuilder for chained access.
- */
- public WriteOptionsBuilder dateTimeFormat(String format) {
- addCustomWrittenClass(Date.class, new Writers.DateWriter(format));
- return this;
- }
/**
* This option permits adding non-standard accessors (used when writing JSON) that access properties from objects,
diff --git a/src/main/java/com/cedarsoftware/io/Writers.java b/src/main/java/com/cedarsoftware/io/Writers.java
index 7dc78214..b74cf93d 100644
--- a/src/main/java/com/cedarsoftware/io/Writers.java
+++ b/src/main/java/com/cedarsoftware/io/Writers.java
@@ -4,7 +4,6 @@
import java.io.Writer;
import java.math.BigDecimal;
import java.math.BigInteger;
-import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
@@ -20,8 +19,6 @@
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.SignStyle;
import java.time.temporal.TemporalAccessor;
-import java.util.Calendar;
-import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import java.util.UUID;
@@ -206,40 +203,61 @@ public String extractString(Object o) {
public static class CalendarWriter implements JsonWriter.JsonClassWriter {
@Override
+ public void writePrimitiveForm(Object o, Writer output, WriterContext context) throws IOException {
+ String formatted = Converter.convert(o, String.class);
+ JsonWriter.writeBasicString(output, formatted);
+ }
+
public void write(Object obj, boolean showType, Writer output, WriterContext context) throws IOException {
- Calendar cal = (Calendar) obj;
- // TODO: shouldn't this be the one inside the WriterContext? and shouldn't there be a back up of parseDate() here?
- dateFormat.get().setTimeZone(cal.getTimeZone());
- output.write("\"time\":\"");
- output.write(dateFormat.get().format(cal.getTime()));
- output.write("\",\"zone\":\"");
- output.write(cal.getTimeZone().getID());
- output.write('"');
+ if (showType) {
+ JsonWriter.writeBasicString(output, "calendar");
+ output.write(':');
+ }
+
+ writePrimitiveForm(obj, output, context);
+ }
+
+ public boolean hasPrimitiveForm(WriterContext context) {
+ return true;
}
}
public static class DateAsLongWriter extends PrimitiveValueWriter {
@Override
public String extractString(Object o) {
- return Long.toString(((Date) o).getTime());
+ if (o instanceof java.sql.Date) {
+ // Just use the date's built-in toString - it's already in JDBC format
+ return o.toString();
+ } else {
+ return Long.toString(((java.util.Date) o).getTime());
+ }
}
}
-
- public static class DateWriter extends PrimitiveUtf8StringWriter {
- // could change to DateFormatter.ofPattern to keep from creating new objects
- private final String dateFormat;
-
- public DateWriter(String format) {
- this.dateFormat = format;
+
+ public static class DateWriter implements JsonWriter.JsonClassWriter {
+ @Override
+ public void writePrimitiveForm(Object o, Writer output, WriterContext context) throws IOException {
+ String formatted = Converter.convert(o, String.class);
+ JsonWriter.writeBasicString(output, formatted);
}
- public String extractString(Object o) {
- Date date = (Date) o;
- return new SimpleDateFormat(dateFormat).format(date);
+ public void write(Object obj, boolean showType, Writer output, WriterContext context) throws IOException {
+ if (showType) {
+ String key;
+ if (obj instanceof java.sql.Date) {
+ key = "sqlDate";
+ } else {
+ key = "date";
+ }
+ JsonWriter.writeBasicString(output, key);
+ output.write(':');
+ }
+
+ writePrimitiveForm(obj, output, context);
}
- String getDateFormat() {
- return dateFormat;
+ public boolean hasPrimitiveForm(WriterContext context) {
+ return true;
}
}
@@ -255,9 +273,6 @@ public LocalDateAsLong() {
}
public void writePrimitiveForm(Object o, Writer output, WriterContext writerContext) throws IOException {
-
- //TODO: Change to using converter and having the writeOptions provide a zoneId;
- //TODO: If we're going to provide a LocalDateAsLong we should also provide a LocalDateTimeAsLong
LocalDate localDate = (LocalDate) o;
ZonedDateTime zonedDateTime = localDate.atStartOfDay(zoneId);
@@ -358,15 +373,15 @@ public OffsetDateTimeWriter() {
}
public static class TimestampWriter implements JsonWriter.JsonClassWriter {
+ @Override
public void writePrimitiveForm(Object o, Writer output, WriterContext context) throws IOException {
- Timestamp timestamp = (Timestamp) o;
- String ts = Converter.convert(timestamp, String.class);
- JsonWriter.writeBasicString(output, ts);
+ String formatted = Converter.convert(o, String.class);
+ JsonWriter.writeBasicString(output, formatted);
}
public void write(Object obj, boolean showType, Writer output, WriterContext context) throws IOException {
if (showType) {
- JsonWriter.writeBasicString(output, VALUE);
+ JsonWriter.writeBasicString(output, "timestamp");
output.write(':');
}
diff --git a/src/main/java/com/cedarsoftware/io/factory/TimestampFactory.java b/src/main/java/com/cedarsoftware/io/factory/TimestampFactory.java
deleted file mode 100644
index c511f055..00000000
--- a/src/main/java/com/cedarsoftware/io/factory/TimestampFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.cedarsoftware.io.factory;
-
-import java.sql.Timestamp;
-
-import com.cedarsoftware.io.JsonIoException;
-import com.cedarsoftware.io.JsonObject;
-import com.cedarsoftware.io.JsonReader;
-import com.cedarsoftware.io.Resolver;
-
-/**
- * @author John DeRegnaucourt (jdereg@gmail.com)
- *
- * Copyright (c) Cedar Software LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *