You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by zh...@apache.org on 2020/05/08 12:33:49 UTC
[pulsar] 03/38: ISSUE-6612 FIX: parse long field in
GenricJsonRecord (#6612) (#6622)
This is an automated email from the ASF dual-hosted git repository.
zhaijia pushed a commit to branch branch-2.5
in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit 8035ae04a3f7f96e9829957dd5d3185ad4049b6c
Author: Lin Yiming <ro...@gmail.com>
AuthorDate: Mon Apr 6 03:17:12 2020 +0800
ISSUE-6612 FIX: parse long field in GenricJsonRecord (#6612) (#6622)
Fixes #6612
### Motivation
If message sent in json schema, long field will be decoded as int if its value below Integer.MAX_VALUE, other wise decoded as string.
For example, the json message below:
```json
{
"timestamp": 1585204833128
}
```
will be decoded as
```json
{
"timestamp": "1585204833128"
}
```
### Modifications
Add field type check in GenericJsonRecord
(cherry picked from commit 1aad3b73efe2a2afe0cd2598987f112416117159)
---
.../impl/schema/generic/GenericJsonRecord.java | 12 +++--
.../impl/schema/generic/GenericJsonRecordTest.java | 57 ++++++++++++++++++++++
2 files changed, 65 insertions(+), 4 deletions(-)
diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java
index 6f57631..650ca46 100644
--- a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java
+++ b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java
@@ -55,12 +55,16 @@ class GenericJsonRecord extends VersionedGenericRecord {
return new GenericJsonRecord(schemaVersion, fields, fn);
} else if (fn.isBoolean()) {
return fn.asBoolean();
- } else if (fn.isInt()) {
- return fn.asInt();
} else if (fn.isFloatingPointNumber()) {
return fn.asDouble();
- } else if (fn.isDouble()) {
- return fn.asDouble();
+ } else if (fn.isBigInteger()) {
+ if (fn.canConvertToLong()) {
+ return fn.asLong();
+ } else {
+ return fn.asText();
+ }
+ } else if (fn.isNumber()) {
+ return fn.numberValue();
} else {
return fn.asText();
}
diff --git a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecordTest.java b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecordTest.java
new file mode 100644
index 0000000..0de3e3e
--- /dev/null
+++ b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecordTest.java
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pulsar.client.impl.schema.generic;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.testng.annotations.Test;
+
+import java.util.Collections;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+
+public class GenericJsonRecordTest {
+
+ @Test
+ public void decodeLongField() throws Exception{
+ String jsonStr = "{\"timestamp\":1585204833128, \"count\":2, \"value\": 1.1, \"on\":true}";
+ byte[] jsonStrBytes = jsonStr.getBytes();
+ ObjectMapper objectMapper = new ObjectMapper();
+ JsonNode jn = objectMapper.readTree(new String(jsonStrBytes, 0, jsonStrBytes.length, UTF_8));
+ GenericJsonRecord record = new GenericJsonRecord(null, Collections.emptyList(), jn);
+
+ Object longValue = record.getField("timestamp");
+ assertTrue(longValue instanceof Long);
+ assertEquals(1585204833128L, longValue);
+
+ Object intValue = record.getField("count");
+ assertTrue(intValue instanceof Integer);
+ assertEquals(2, intValue);
+
+ Object value = record.getField("value");
+ assertTrue(value instanceof Double);
+ assertEquals(1.1, value);
+
+ Object boolValue = record.getField("on");
+ assertTrue((boolean)boolValue);
+ }
+}
\ No newline at end of file