From 59de0b57bec99b27f9a4931b0c6a4f7cc3704abc Mon Sep 17 00:00:00 2001 From: mallomar <40035402+mallomar@users.noreply.github.com> Date: Tue, 7 Oct 2025 12:35:11 -0400 Subject: [PATCH 1/2] Fix: Accept numeric version field in API requests KOReader sends version as a number per the AnkiConnect API spec. Made JSON parser lenient to accept both numeric and string version fields for compatibility. --- .../ankiconnectandroid/request_parsers/Parser.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/kamwithk/ankiconnectandroid/request_parsers/Parser.java b/app/src/main/java/com/kamwithk/ankiconnectandroid/request_parsers/Parser.java index 92727dc..6002f46 100644 --- a/app/src/main/java/com/kamwithk/ankiconnectandroid/request_parsers/Parser.java +++ b/app/src/main/java/com/kamwithk/ankiconnectandroid/request_parsers/Parser.java @@ -21,9 +21,14 @@ public class Parser { public static Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create(); public static Gson gsonNoSerialize = new GsonBuilder().setPrettyPrinting().create(); - public static JsonObject parse(String raw_data) { - return JsonParser.parseString(raw_data).getAsJsonObject(); - } +public static JsonObject parse(String raw_data) { + // Use a more lenient parser that accepts both numeric and string version fields + com.google.gson.stream.JsonReader reader = new com.google.gson.stream.JsonReader( + new java.io.StringReader(raw_data) + ); + reader.setLenient(true); + return JsonParser.parseReader(reader).getAsJsonObject(); +} public static String get_action(JsonObject data) { return data.get("action").getAsString(); From 23955c023f010a445c8d76d35369ffea5995aad7 Mon Sep 17 00:00:00 2001 From: mallomar <40035402+mallomar@users.noreply.github.com> Date: Tue, 7 Oct 2025 12:38:26 -0400 Subject: [PATCH 2/2] Make get_version handle both numeric and string types --- .../request_parsers/Parser.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/kamwithk/ankiconnectandroid/request_parsers/Parser.java b/app/src/main/java/com/kamwithk/ankiconnectandroid/request_parsers/Parser.java index 6002f46..ce979fd 100644 --- a/app/src/main/java/com/kamwithk/ankiconnectandroid/request_parsers/Parser.java +++ b/app/src/main/java/com/kamwithk/ankiconnectandroid/request_parsers/Parser.java @@ -34,12 +34,25 @@ public static String get_action(JsonObject data) { return data.get("action").getAsString(); } - public static int get_version(JsonObject data, int fallback) { - if (data.has("version")) { - return data.get("version").getAsInt(); +public static int get_version(JsonObject data, int fallback) { + if (data.has("version")) { + JsonElement versionElement = data.get("version"); + // Handle both string and numeric version fields + if (versionElement.isJsonPrimitive()) { + com.google.gson.JsonPrimitive primitive = versionElement.getAsJsonPrimitive(); + if (primitive.isNumber()) { + return primitive.getAsInt(); + } else if (primitive.isString()) { + try { + return Integer.parseInt(primitive.getAsString()); + } catch (NumberFormatException e) { + return fallback; + } + } } - return fallback; } + return fallback; +} public static String getDeckName(JsonObject raw_data) { return raw_data.get("params").getAsJsonObject().get("note").getAsJsonObject().get("deckName").getAsString();