From 316b458071485960cfea239ec733805328ec2d2e Mon Sep 17 00:00:00 2001
From: Benoit Lavenier <benoit.lavenier@e-is.pro>
Date: Fri, 21 Aug 2020 15:18:46 +0200
Subject: [PATCH] [fix] Json parser must be able to parse null value

---
 .../core/util/json/JsonAttributeParser.java   |  3 ++
 .../util/json/JsonAttributeParserTest.java    | 34 +++++++++++++++++--
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/duniter4j-core-shared/src/main/java/org/duniter/core/util/json/JsonAttributeParser.java b/duniter4j-core-shared/src/main/java/org/duniter/core/util/json/JsonAttributeParser.java
index 87914dba..40e28e0e 100644
--- a/duniter4j-core-shared/src/main/java/org/duniter/core/util/json/JsonAttributeParser.java
+++ b/duniter4j-core-shared/src/main/java/org/duniter/core/util/json/JsonAttributeParser.java
@@ -123,6 +123,9 @@ public class JsonAttributeParser<T extends Object> {
 
         final String value = matcher.group(1);
         try {
+            if (value == null) {
+                return null;
+            }
             return parseValue(value);
         }
         catch(NumberFormatException | UnknownFormatConversionException e) {
diff --git a/duniter4j-core-shared/src/test/java/org/duniter/core/util/json/JsonAttributeParserTest.java b/duniter4j-core-shared/src/test/java/org/duniter/core/util/json/JsonAttributeParserTest.java
index 800ecf2f..ea8d7ae3 100644
--- a/duniter4j-core-shared/src/test/java/org/duniter/core/util/json/JsonAttributeParserTest.java
+++ b/duniter4j-core-shared/src/test/java/org/duniter/core/util/json/JsonAttributeParserTest.java
@@ -34,7 +34,7 @@ public class JsonAttributeParserTest {
     private static final String PROPERTY_TS = "ts";
     private static final String PROPERTY_B = "b";
 
-    private  static final String TS_VALUE = "2014-12-02T13:58:23.801+0100";
+    private static final String TS_VALUE = "2014-12-02T13:58:23.801+0100";
     private static final String OBJ_JSON = ("{'id':'joe','ts':'" + TS_VALUE + "','foo':{'bar':{'v1':50019820,'v2':0,     'v3':0.001, 'v4':-100, 'v5':0.000001, 'v6':0.0, 'b':true}}}")
             .replace("'", "\"");
 
@@ -110,7 +110,35 @@ public class JsonAttributeParserTest {
         JsonAttributeParser<String> tsAttribute = new JsonAttributeParser<>(PROPERTY_TS, String.class);
         newJson = tsAttribute.removeFromJson(newJson);
 
-        expectedJson = expectedJson.replace("\"ts\":\""+TS_VALUE+"\",", "");
+        expectedJson = expectedJson.replace("\"ts\":\"" + TS_VALUE + "\",", "");
         Assert.assertEquals(expectedJson, newJson);
     }
-}
+
+    @Test
+    public void parseNullableValue() {
+        // Long
+        {
+            String jsonString = "{\n" +
+                    "    \"ts\": null\n" +
+                    "}";
+
+            // nullable = true
+            JsonAttributeParser<Long> tsAttribute = new JsonAttributeParser<>(PROPERTY_TS, Long.class);
+            Long parsedValue = tsAttribute.getValue(jsonString);
+            Assert.assertNull(parsedValue);
+        }
+
+        // String
+        {
+            String jsonString = "{\n" +
+                    "    \"id\": null\n" +
+                    "}";
+
+            // nullable = true
+            JsonAttributeParser<String> idAttribute = new JsonAttributeParser<>(PROPERTY_ID, String.class);
+            String parsedValue = idAttribute.getValue(jsonString);
+            Assert.assertNull(parsedValue);
+
+        }
+    }
+}
\ No newline at end of file
-- 
GitLab