Skip to content

Commit

Permalink
Uniformizing Writers ahead of making them data-driven (config-driven)
Browse files Browse the repository at this point in the history
  • Loading branch information
jdereg committed Feb 9, 2025
1 parent 19aac20 commit 2943ac7
Show file tree
Hide file tree
Showing 9 changed files with 152 additions and 263 deletions.
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,15 @@ ___
To include in your project:
##### Gradle
```groovy
implementation 'com.cedarsoftware:json-io:4.34.0'
implementation 'com.cedarsoftware:json-io:4.40.0'
```

##### Maven
```xml
<dependency>
<groupId>com.cedarsoftware</groupId>
<artifactId>json-io</artifactId>
<version>4.34.0</version>
<version>4.40.0</version>
</dependency>
```
___
Expand All @@ -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.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))
> - 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.40.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.40.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.40.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.40.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.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
> - Use [JsonReader.ClassFactory](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.40.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.40.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.34.0 (current)
>- [ ] **Version**: [4.34.0](https://www.javadoc.io/doc/com.cedarsoftware/json-io/4.34.0/index.html)
>### 4.40.0 (current)
>- [ ] **Version**: [4.40.0](https://www.javadoc.io/doc/com.cedarsoftware/json-io/4.40.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.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))
> - 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.40.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.40.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.40.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.40.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.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, ...
> - Use [JsonReader.ClassFactory](https://www.javadoc.io/static/com.cedarsoftware/json-io/4.40.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.40.0/com/cedarsoftware/io/JsonWriter.JsonClassWriter.html) to customize the output JSON for a particular class
>- [ ] Updates will be 4.41.0, 4.42.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)
Expand Down
6 changes: 4 additions & 2 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
### Revision History
#### 4.34.0
* Improved Date and java.sql.Date handling within Converters.
#### 4.40.0
* All Time and Date classes compressed to a single String representation in JSON, uses ISO format when possible.
* Java's `Pattern` and `Currency` support added
* Updated [java-util](https://github.com/jdereg/java-util/blob/master/changelog.md) from `3.0.2` to `3.0.3.`
#### 4.33.0
* New custom `ClassFactory` classes are easier to write:
* See [examples](user-guide.md#classfactory-and-customwriter-examples)
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
<version.java-util>3.0.3</version.java-util>
<!-- testing only -->
<version.junit-jupiter-params>5.11.4</version.junit-jupiter-params>
<version.assertj-core>3.27.2</version.assertj-core>
<version.assertj-core>3.27.3</version.assertj-core>
<version.gson>2.11.0</version.gson>
<version.jackson-core>2.18.2</version.jackson-core>

Expand Down
71 changes: 29 additions & 42 deletions src/main/java/com/cedarsoftware/io/JsonWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -1700,52 +1700,39 @@ public static void writeBasicString(final Writer writer, String s) throws IOExce
writer.write('\"');
}

private static void writeChar(Writer writer, char c) throws IOException {
if (c < ' ') { // Anything less than ASCII space, write either in \\u00xx form, or the special \t, \n, etc. form
switch (c) {
case '\b':
writer.write("\\b");
break;
case '\f':
writer.write("\\f");
break;
case '\n':
writer.write("\\n");
break;
case '\r':
writer.write("\\r");
break;
case '\t':
writer.write("\\t");
break;
default:
writer.write(String.format("\\u%04X", (int) c));
break;
}
} else if (c == '\\' || c == '"') {
writer.write('\\');
writer.write(c);
} else { // Anything else - write in UTF-8 form (multibyte encoded) (OutputStreamWriter is UTF-8)
writer.write(c);
}
}

/**
* Write out special characters "\b, \f, \t, \n, \r", as such, backslash as \\
* quote as \" and values less than an ASCII space (20hex) as "\\u00xx" format,
* characters in the range of ASCII space to a '~' as ASCII, and anything higher in UTF-8.
*
* @param output Writer to which the UTF-8 string will be written to
* @param s String to be written in UTF-8 format on the output stream.
* @throws IOException if an error occurs writing to the output stream.
*/
public static void writeJsonUtf8String(final Writer output, String s) throws IOException {
if (s == null) {
output.write("null");
return;
}
output.write('\"');
final int len = s.length();

for (int i = 0; i < len; i++) {
writeChar(output, s.charAt(i));
for (int i = 0; i < len; ) {
int codePoint = s.codePointAt(i);
if (codePoint < 0x20) {
// Control characters
switch (codePoint) {
case '\b': output.write("\\b"); break;
case '\f': output.write("\\f"); break;
case '\n': output.write("\\n"); break;
case '\r': output.write("\\r"); break;
case '\t': output.write("\\t"); break;
default: output.write(String.format("\\u%04x", codePoint));
}
}
else if (codePoint == '"') {
output.write("\\\"");
}
else if (codePoint == '\\') {
output.write("\\\\");
}
else {
// For all other characters (including valid surrogate pairs), write directly
output.write(s, i, Character.charCount(codePoint));
}
i += Character.charCount(codePoint);
}
output.write('\"');
}
}
}
Loading

0 comments on commit 2943ac7

Please sign in to comment.