[jOOQ/jOOQ#12023] JSONB equals, hashCode, toString() should be formatting agnostic

This commit is contained in:
Lukas Eder 2021-06-22 14:21:25 +02:00
parent 887518ee24
commit 59adfbf947
2 changed files with 25 additions and 4 deletions

View File

@ -48,6 +48,7 @@ import org.jooq.Condition;
import org.jooq.Configuration;
import org.jooq.DSLContext;
import org.jooq.ExecuteContext;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.jooq.impl.DefaultConfiguration;
import org.jooq.impl.DefaultExecuteListener;
@ -92,6 +93,7 @@ public class SakilaReportService {
// Some nice debug logging of formatted queries and the first 5 rows in each result set.
dsl = DSL.using(new DefaultConfiguration()
.set(ds)
.set(SQLDialect.POSTGRES)
.set(DefaultExecuteListenerProvider.providers(new DefaultExecuteListener() {
@Override
public void executeEnd(ExecuteContext ctx) {

View File

@ -38,6 +38,10 @@
package org.jooq;
import java.io.Serializable;
import java.util.Objects;
import org.jooq.tools.json.JSONParser;
import org.jooq.tools.json.ParseException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -53,7 +57,8 @@ import org.jetbrains.annotations.Nullable;
*/
public final class JSONB implements Serializable {
private final String data;
private final String data;
private transient Object parsed;
private JSONB(String data) {
this.data = String.valueOf(data);
@ -92,9 +97,23 @@ public final class JSONB implements Serializable {
return data == null ? null : jsonb(data);
}
private final Object parsed() {
if (parsed == null) {
try {
parsed = new JSONParser().parse(data);
}
catch (ParseException e) {
parsed = data;
}
}
return parsed;
}
@Override
public int hashCode() {
return data.hashCode();
Object p = parsed();
return p == null ? 0 : p.hashCode();
}
@Override
@ -102,12 +121,12 @@ public final class JSONB implements Serializable {
if (this == obj)
return true;
if (obj instanceof JSONB)
return data.equals(((JSONB) obj).data);
return Objects.equals(parsed(), (((JSONB) obj).parsed()));
return false;
}
@Override
public String toString() {
return String.valueOf(data);
return String.valueOf(parsed());
}
}