diff --git a/src/main/java/com/mindee/parsing/v2/field/BaseField.java b/src/main/java/com/mindee/parsing/v2/field/BaseField.java index c56dfa54c..b7a16ea89 100644 --- a/src/main/java/com/mindee/parsing/v2/field/BaseField.java +++ b/src/main/java/com/mindee/parsing/v2/field/BaseField.java @@ -1,21 +1,29 @@ package com.mindee.parsing.v2.field; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; /** * Base class for V2 fields. */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +@NoArgsConstructor +@AllArgsConstructor public abstract class BaseField { - /** - * Field's location. - */ - @JsonProperty("locations") - private List locations; - /** * Confidence associated with the field. */ @JsonProperty("confidence") private FieldConfidence confidence; + + /** + * Field's location. + */ + @JsonProperty("locations") + private List locations; } diff --git a/src/main/java/com/mindee/parsing/v2/field/DynamicFieldDeserializer.java b/src/main/java/com/mindee/parsing/v2/field/DynamicFieldDeserializer.java index 4ca72bc8f..c2a0a831b 100644 --- a/src/main/java/com/mindee/parsing/v2/field/DynamicFieldDeserializer.java +++ b/src/main/java/com/mindee/parsing/v2/field/DynamicFieldDeserializer.java @@ -6,6 +6,8 @@ import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; /** * Custom deserializer for {@link DynamicField}. @@ -18,11 +20,8 @@ public DynamicField deserialize(JsonParser jp, DeserializationContext ctxt) thro JsonNode root = codec.readTree(jp); if (root.has("items") && root.get("items").isArray()) { - ListField list = new ListField(); - for (JsonNode itemNode : root.get("items")) { - list.getItems().add(codec.treeToValue(itemNode, DynamicField.class)); - } - return DynamicField.of(list); + ListField listField = codec.treeToValue(root, ListField.class); + return DynamicField.of(listField); } if (root.has("fields") && root.get("fields").isObject()) { diff --git a/src/main/java/com/mindee/parsing/v2/field/ListField.java b/src/main/java/com/mindee/parsing/v2/field/ListField.java index 1234e914e..de69bde25 100644 --- a/src/main/java/com/mindee/parsing/v2/field/ListField.java +++ b/src/main/java/com/mindee/parsing/v2/field/ListField.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.ArrayList; import java.util.List; import java.util.StringJoiner; import lombok.AllArgsConstructor; @@ -24,7 +23,7 @@ public final class ListField extends BaseField { * Items of the list. */ @JsonProperty("items") - private List items = new ArrayList<>(); + private List items; @Override public String toString() { diff --git a/src/main/java/com/mindee/parsing/v2/field/ObjectField.java b/src/main/java/com/mindee/parsing/v2/field/ObjectField.java index 36991c12a..5fd5561d4 100644 --- a/src/main/java/com/mindee/parsing/v2/field/ObjectField.java +++ b/src/main/java/com/mindee/parsing/v2/field/ObjectField.java @@ -28,7 +28,7 @@ public String toString() { return "\n" + (fields != null ? fields.toString(1) : ""); } - public String toStringFromList(){ + public String toStringFromList() { return fields != null ? fields.toString(2).substring(4) : ""; } } diff --git a/src/main/java/com/mindee/parsing/v2/field/SimpleField.java b/src/main/java/com/mindee/parsing/v2/field/SimpleField.java index d9a945e7c..73ceb9903 100644 --- a/src/main/java/com/mindee/parsing/v2/field/SimpleField.java +++ b/src/main/java/com/mindee/parsing/v2/field/SimpleField.java @@ -3,10 +3,9 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import lombok.AllArgsConstructor; +import java.util.List; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.NoArgsConstructor; /** * Field holding a single scalar value. @@ -15,16 +14,20 @@ @EqualsAndHashCode(callSuper = true) @JsonIgnoreProperties(ignoreUnknown = true) @JsonDeserialize(using = SimpleFieldDeserializer.class) -@AllArgsConstructor -@NoArgsConstructor public final class SimpleField extends BaseField { /** - * Value (string, boolean, number … or {@code null}). + * Value (string, boolean, double, or {@code null}). */ @JsonProperty("value") private Object value; + public SimpleField(Object value, FieldConfidence confidence, List locations) { + super(confidence, locations); + this.value = value; + } + + @Override public String toString() { if (value == null) return ""; diff --git a/src/main/java/com/mindee/parsing/v2/field/SimpleFieldDeserializer.java b/src/main/java/com/mindee/parsing/v2/field/SimpleFieldDeserializer.java index 45fded7eb..8abe56a71 100644 --- a/src/main/java/com/mindee/parsing/v2/field/SimpleFieldDeserializer.java +++ b/src/main/java/com/mindee/parsing/v2/field/SimpleFieldDeserializer.java @@ -6,6 +6,8 @@ import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; /** * Custom deserializer for {@link SimpleField}. @@ -25,20 +27,30 @@ public SimpleField deserialize(JsonParser jp, DeserializationContext ctxt) throw case BOOLEAN: value = valueNode.booleanValue(); break; - case NUMBER: value = valueNode.doubleValue(); break; - case STRING: value = valueNode.textValue(); break; - default: value = codec.treeToValue(valueNode, Object.class); } } - return new SimpleField(value); + FieldConfidence confidence = codec.treeToValue( + root.get("confidence"), FieldConfidence.class + ); + + List locations = null; + JsonNode locationsNode = root.get("locations"); + if (locationsNode != null && locationsNode.isArray()) { + locations = new ArrayList<>(); + for (JsonNode node : locationsNode) { + locations.add(codec.treeToValue(node, FieldLocation.class)); + } + } + + return new SimpleField(value, confidence, locations); } } diff --git a/src/test/java/com/mindee/parsing/v2/InferenceTest.java b/src/test/java/com/mindee/parsing/v2/InferenceTest.java index 865427adc..dc9642d7a 100644 --- a/src/test/java/com/mindee/parsing/v2/InferenceTest.java +++ b/src/test/java/com/mindee/parsing/v2/InferenceTest.java @@ -196,17 +196,23 @@ void standardFieldTypes_mustExposeCorrectTypes() throws IOException { SimpleField fieldSimpleString = fields.get("field_simple_string").getSimpleField(); assertNotNull(fieldSimpleString); assertInstanceOf(String.class, fieldSimpleString.getValue()); + assertEquals(FieldConfidence.Certain, fieldSimpleString.getConfidence()); + assertInstanceOf(List.class, fieldSimpleString.getLocations()); + assertEquals(1, fieldSimpleString.getLocations().size()); SimpleField fieldSimpleFloat = fields.get("field_simple_float").getSimpleField(); assertNotNull(fieldSimpleFloat); assertInstanceOf(Double.class, fieldSimpleFloat.getValue()); + assertEquals(FieldConfidence.High, fieldSimpleFloat.getConfidence()); SimpleField fieldSimpleInt = fields.get("field_simple_int").getSimpleField(); assertNotNull(fieldSimpleInt); assertInstanceOf(Double.class, fieldSimpleInt.getValue()); + assertEquals(FieldConfidence.Medium, fieldSimpleInt.getConfidence()); SimpleField fieldSimpleZero = fields.get("field_simple_zero").getSimpleField(); assertNotNull(fieldSimpleZero); + assertEquals(FieldConfidence.Low, fieldSimpleZero.getConfidence()); assertInstanceOf(Double.class, fieldSimpleZero.getValue()); SimpleField fieldSimpleBool = fields.get("field_simple_bool").getSimpleField(); @@ -223,16 +229,21 @@ void standardFieldTypes_mustExposeCorrectTypes() throws IOException { assertEquals(2, simpleItems.size()); SimpleField firstSimpleItem = simpleItems.get(0).getSimpleField(); assertNotNull(firstSimpleItem); + assertEquals(FieldConfidence.Medium, firstSimpleItem.getConfidence()); assertInstanceOf(String.class, firstSimpleItem.getValue()); for (DynamicField item : fieldSimpleList.getItems()) { - assertInstanceOf(String.class, item.getSimpleField().getValue()); + SimpleField itemField = item.getSimpleField(); + assertInstanceOf(String.class, itemField.getValue()); + assertEquals(1, itemField.getLocations().size()); } ObjectField fieldObject = fields.get("field_object").getObjectField(); assertNotNull(fieldObject); InferenceFields fieldObjectFields = fieldObject.getFields(); assertEquals(2, fieldObjectFields.size()); - assertInstanceOf(String.class, fieldObjectFields.get("subfield_1").getSimpleField().getValue()); + SimpleField subfield1 = fieldObjectFields.get("subfield_1").getSimpleField(); + assertInstanceOf(String.class, subfield1.getValue()); + assertEquals(FieldConfidence.High, subfield1.getConfidence()); ListField fieldObjectList = fields.get("field_object_list").getListField(); assertNotNull(fieldObjectList); @@ -245,10 +256,9 @@ void standardFieldTypes_mustExposeCorrectTypes() throws IOException { firstObjectItem.getFields().get("subfield_1").getSimpleField().getValue() ); for (DynamicField item : fieldObjectList.getItems()) { - assertInstanceOf( - String.class, - item.getObjectField().getFields().get("subfield_1").getSimpleField().getValue() - ); + SimpleField listSubfield1 = item.getObjectField().getFields().get("subfield_1").getSimpleField(); + assertInstanceOf(String.class, listSubfield1.getValue()); + assertEquals(1, listSubfield1.getLocations().size()); } } } diff --git a/src/test/resources b/src/test/resources index 632af76d6..f0175f0ee 160000 --- a/src/test/resources +++ b/src/test/resources @@ -1 +1 @@ -Subproject commit 632af76d6eefe551cdeb2b7fa2f325cecec1b66f +Subproject commit f0175f0ee644b57b409e6ad7e1c030f28fbe57ef