Skip to content

Commit 9fc82bc

Browse files
committed
jsontransformer: All numbers as numbers
Signed-off-by: kingthorin <kingthorin@users.noreply.github.com>
1 parent 71fd588 commit 9fc82bc

3 files changed

Lines changed: 51 additions & 13 deletions

File tree

src/main/java/net/datafaker/transformations/JsonTransformer.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public String apply(IN input, Schema<IN, ?> schema) {
3030
StringBuilder sb = new StringBuilder();
3131
sb.append("{");
3232
for (int i = 0; i < fields.length; i++) {
33-
value2String((fields[i].getName()), sb);
33+
value2String(input, (fields[i].getName()), sb);
3434
sb.append(": ");
3535
if (fields[i] instanceof CompositeField) {
3636
sb.append(apply(input, (CompositeField) fields[i], i));
@@ -94,7 +94,7 @@ private void applyValue(IN input, StringBuilder sb, Object value) {
9494
} else if (value != null && value.getClass().isArray()) {
9595
sb.append(generate(input, Arrays.asList((Object[]) value)));
9696
} else {
97-
value2String(value, sb);
97+
value2String(input, value, sb);
9898
}
9999
}
100100

@@ -117,19 +117,18 @@ private String generate(IN input, Collection<Object> collection) {
117117
return sb.toString();
118118
}
119119

120-
private static void value2String(Object value, StringBuilder sb) {
120+
private void value2String(IN input, Object value, StringBuilder sb) {
121121
if (value == null) {
122122
sb.append("null");
123123
} else if (value instanceof Integer
124-
|| value instanceof Long
125-
|| value instanceof Short
126-
|| value instanceof BigInteger
127-
|| value instanceof Boolean
128-
|| (value instanceof Double
129-
&& BigDecimal.valueOf((Double) value).remainder(BigDecimal.ONE).doubleValue() == 0)
130-
|| (value instanceof BigDecimal
131-
&& ((BigDecimal) value).remainder(BigDecimal.ONE).doubleValue() == 0)) {
132-
sb.append(value);
124+
|| value instanceof Long
125+
|| value instanceof Short
126+
|| value instanceof BigInteger
127+
|| value instanceof Boolean
128+
|| value instanceof Double
129+
|| value instanceof BigDecimal) {
130+
// Quote if input type is specifically String
131+
sb = input instanceof String ? sb.append('"').append(value).append('"') : sb.append(value);
133132
} else {
134133
String val = String.valueOf(value);
135134
boolean toWrap = !val.startsWith("#{json");

src/test/java/net/datafaker/formats/JsonTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ private static Stream<Arguments> generateTestSchema() {
204204
of(Schema.of(field("key", () -> "value")), "{\"key\": \"value\"}"),
205205
of(Schema.of(field("number", () -> 123)), "{\"number\": 123}"),
206206
of(Schema.of(field("number", () -> 123.0)), "{\"number\": 123.0}"),
207-
of(Schema.of(field("number", () -> 123.123)), "{\"number\": \"123.123\"}"),
207+
of(Schema.of(field("number", () -> 123.123)), "{\"number\": 123.123}"),
208208
of(Schema.of(field("boolean", () -> true)), "{\"boolean\": true}"),
209209
of(Schema.of(field("nullValue", () -> null)), "{\"nullValue\": null}"),
210210
of(
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package net.datafaker.transformations;
2+
3+
import static net.datafaker.transformations.Field.field;
4+
import static org.assertj.core.api.Assertions.assertThat;
5+
6+
import java.math.BigDecimal;
7+
8+
import org.junit.jupiter.api.Test;
9+
10+
import net.datafaker.AbstractFakerTest;
11+
12+
class JsonTransformerTest extends AbstractFakerTest{
13+
14+
@Test
15+
void issue1556Double() {
16+
// Given
17+
double aDouble = faker.number().randomDouble(3, 1, 2);
18+
Schema<Object, ?> schema = Schema.of(
19+
field("Dbl", () -> aDouble));
20+
// When
21+
JsonTransformer<Object> transformer = JsonTransformer.builder().build();
22+
String json = transformer.generate(schema, 1);
23+
// Then - Number not quoted
24+
assertThat(json).isEqualTo("{\"Dbl\": %s}".formatted(aDouble));
25+
}
26+
27+
@Test
28+
void issue1556BigDecimal() {
29+
// Given
30+
BigDecimal aBigDec = BigDecimal.valueOf(faker.number().randomDouble(7, 1, 2));
31+
Schema<Object, ?> schema = Schema.of(
32+
field("BigDecimal", () -> aBigDec));
33+
// When
34+
JsonTransformer<Object> transformer = JsonTransformer.builder().build();
35+
String json = transformer.generate(schema, 1);
36+
// Then - Number not quoted
37+
assertThat(json).isEqualTo("{\"BigDecimal\": %s}".formatted(aBigDec));
38+
}
39+
}

0 commit comments

Comments
 (0)