summaryrefslogtreecommitdiff
path: root/platform/android/src/gson/json_element.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/src/gson/json_element.cpp')
-rw-r--r--platform/android/src/gson/json_element.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/platform/android/src/gson/json_element.cpp b/platform/android/src/gson/json_element.cpp
index 7c9a34c03c..405efe71ca 100644
--- a/platform/android/src/gson/json_element.cpp
+++ b/platform/android/src/gson/json_element.cpp
@@ -2,6 +2,7 @@
#include "json_array.hpp"
#include "json_object.hpp"
#include "json_primitive.hpp"
+#include "../math/math.hpp"
namespace mbgl {
namespace android {
@@ -58,13 +59,21 @@ mbgl::Value JsonElement::convert(jni::JNIEnv &env, const jni::Object<JsonElement
static auto getAsBoolean = primitiveClass.GetMethod<jni::jboolean ()>(env, "getAsBoolean");
static auto getAsString = primitiveClass.GetMethod<jni::String ()>(env, "getAsString");
static auto getAsDouble = primitiveClass.GetMethod<jni::jdouble ()>(env, "getAsDouble");
+ static auto getAsInteger = primitiveClass.GetMethod<jni::jint ()>(env, "getAsInt");
if (jsonElement.Call(env, isJsonPrimitive)) {
auto primitive = jni::Cast(env, primitiveClass, jsonElement);
if (primitive.Call(env, isBoolean)) {
return bool(primitive.Call(env, getAsBoolean));
} else if (primitive.Call(env, isNumber)) {
- return primitive.Call(env, getAsDouble); // TODO: how to differentiate types here?
+ auto value = primitive.Call(env, getAsDouble);
+ if (value == math::Math::rint(env, value)) {
+ // uint64_t
+ return static_cast<uint64_t>(primitive.Call(env, getAsInteger));
+ } else {
+ // double
+ return value;
+ }
} else if (primitive.Call(env, isString)) {
return jni::Make<std::string>(env, primitive.Call(env, getAsString));
} else {