diff --git a/app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java b/app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java index 2fc8b59..39985c4 100644 --- a/app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java +++ b/app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java @@ -1310,7 +1310,7 @@ public interface PadApiService { private java.util.List vCode; // 验证码列表 @SerializedName("info") - private VerifyOrderInfo info; // 订单信息 + private com.google.gson.JsonElement info; // 订单信息(可能是字符串或对象) @SerializedName("success") private int success; // 成功状态 @@ -1343,8 +1343,49 @@ public interface PadApiService { public java.util.List getVCode() { return vCode; } public void setVCode(java.util.List vCode) { this.vCode = vCode; } - public VerifyOrderInfo getInfo() { return info; } - public void setInfo(VerifyOrderInfo info) { this.info = info; } + public com.google.gson.JsonElement getInfo() { return info; } + public void setInfo(com.google.gson.JsonElement info) { this.info = info; } + + // 辅助方法,用于获取字符串类型的info + public String getInfoAsString() { + if (info != null) { + if (info.isJsonPrimitive()) { + return info.getAsString(); + } else if (info.isJsonObject()) { + return info.toString(); + } + } + return ""; + } + + // 辅助方法,用于获取对象类型的info(需要进一步解析) + public com.google.gson.JsonObject getInfoAsJsonObject() { + if (info != null && info.isJsonObject()) { + return info.getAsJsonObject(); + } else { + return null; + } + } + + // 从info中提取card_no字段 + public String getCardNoFromInfo() { + if (info != null && info.isJsonObject()) { + if (info.getAsJsonObject().has("card_no")) { + return info.getAsJsonObject().get("card_no").getAsString(); + } + } + return ""; + } + + // 从info中提取user_face_id字段 + public String getUserFaceIdFromInfo() { + if (info != null && info.isJsonObject()) { + if (info.getAsJsonObject().has("user_face_id")) { + return info.getAsJsonObject().get("user_face_id").getAsString(); + } + } + return ""; + } public int getSuccess() { return success; } public void setSuccess(int success) { this.success = success; } diff --git a/app/src/main/java/com/ouxuan/oxface/orderOX/OrderVerificationResultActivity.java b/app/src/main/java/com/ouxuan/oxface/orderOX/OrderVerificationResultActivity.java index 209bb40..08c6fc6 100644 --- a/app/src/main/java/com/ouxuan/oxface/orderOX/OrderVerificationResultActivity.java +++ b/app/src/main/java/com/ouxuan/oxface/orderOX/OrderVerificationResultActivity.java @@ -113,8 +113,7 @@ public class OrderVerificationResultActivity extends AppCompatActivity { verifyResult = gson.fromJson(verifyResultJson, PadApiService.VerifyOrderResponse.class).getResult(); if (verifyResult != null) { // 从完整结果中提取信息 - orderInfo = verifyResult.getInfo() != null ? - JsonParser.parseString(gson.toJson(verifyResult.getInfo())) : null; + orderInfo = verifyResult.getInfo(); // 直接使用JsonElement if (orderNo == null || orderNo.isEmpty()) { orderNo = verifyResult.getOrderNo(); } diff --git a/app/src/test/java/com/ouxuan/oxface/JsonParsingVerification.java b/app/src/test/java/com/ouxuan/oxface/JsonParsingVerification.java new file mode 100644 index 0000000..89c1958 --- /dev/null +++ b/app/src/test/java/com/ouxuan/oxface/JsonParsingVerification.java @@ -0,0 +1,89 @@ +package com.ouxuan.oxface; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.ouxuan.oxface.network.api.PadApiService; + +/** + * 验证 JSON 数据解析的简单测试脚本 + */ +public class JsonParsingVerification { + + public static void main(String[] args) { + Gson gson = new Gson(); + + // 测试次卡核销数据(info 为字符串) + String peopleCardJson = "{\n" + + " \"order_no\": \"RC20250910155115457419\",\n" + + " \"start_time\": \"2025-09-10 15:51:16\",\n" + + " \"end_time\": \"4763-08-07 15:51:16\",\n" + + " \"order_type\": 1,\n" + + " \"project\": \"20230727测试\",\n" + + " \"number\": 1,\n" + + " \"v_code\": [\"250910159819\"],\n" + + " \"info\": \"平时\",\n" + + " \"success\": 0,\n" + + " \"pv_usage_duration\": 1,\n" + + " \"many_enter\": false\n" + + "}"; + + // 测试年月卡核销数据(info 为对象) + String monthlyCardJson = "{\n" + + " \"order_no\": \"MC20250908145253448493\",\n" + + " \"start_time\": \"2025-09-08 14:52:59\",\n" + + " \"end_time\": \"2025-10-08 14:52:59\",\n" + + " \"order_type\": 3,\n" + + " \"project\": \"可多次进出\",\n" + + " \"number\": 7,\n" + + " \"v_code\": [\"2509087910\"],\n" + + " \"info\": {\n" + + " \"card_no\": \"2509085314\",\n" + + " \"rest_number\": 5,\n" + + " \"status\": 1,\n" + + " \"verify_desc\": \"人脸验证\",\n" + + " \"verify_time\": \"2025-09-10 11:26:36\",\n" + + " \"verify_type\": 2\n" + + " },\n" + + " \"success\": 2,\n" + + " \"pv_usage_duration\": 0,\n" + + " \"many_enter\": false\n" + + "}"; + + try {\n" + + " // 测试次卡解析\n" + + " System.out.println(\"=== 测试次卡核销数据解析 ===\");\n" + + " PadApiService.VerifyOrderResult peopleCardResult = gson.fromJson(peopleCardJson, PadApiService.VerifyOrderResult.class);\n" + + " \n" + + " System.out.println(\"订单类型: \" + peopleCardResult.getOrderType());\n" + + " System.out.println(\"订单号: \" + peopleCardResult.getOrderNo());\n" + + " \n" + + " JsonElement peopleInfo = peopleCardResult.getInfo();\n" + + " if (peopleInfo != null && peopleInfo.isJsonPrimitive()) {\n" + + " System.out.println(\"Info(字符串): \" + peopleInfo.getAsString());\n" + + " System.out.println(\"辅助方法 getInfoAsString(): \" + peopleCardResult.getInfoAsString());\n" + + " }\n" + + " \n" + + " // 测试年月卡解析\n" + + " System.out.println(\"\\n=== 测试年月卡核销数据解析 ===\");\n" + + " PadApiService.VerifyOrderResult monthlyCardResult = gson.fromJson(monthlyCardJson, PadApiService.VerifyOrderResult.class);\n" + + " \n" + + " System.out.println(\"订单类型: \" + monthlyCardResult.getOrderType());\n" + + " System.out.println(\"订单号: \" + monthlyCardResult.getOrderNo());\n" + + " \n" + + " JsonElement monthlyInfo = monthlyCardResult.getInfo();\n" + + " if (monthlyInfo != null && monthlyInfo.isJsonObject()) {\n" + + " JsonObject cardInfo = monthlyInfo.getAsJsonObject();\n" + + " System.out.println(\"Info(对象)- 卡号: \" + cardInfo.get(\"card_no\").getAsString());\n" + + " System.out.println(\"Info(对象)- 剩余次数: \" + cardInfo.get(\"rest_number\").getAsInt());\n" + + " System.out.println(\"辅助方法 getCardNoFromInfo(): \" + monthlyCardResult.getCardNoFromInfo());\n" + + " }\n" + + " \n" + + " System.out.println(\"\\n✅ 所有测试通过!JSON 解析修复成功。\");\n" + + " \n" + + " } catch (Exception e) {\n" + + " System.err.println(\"❌ JSON 解析失败: \" + e.getMessage());\n" + + " e.printStackTrace();\n" + + " }\n" + + " }\n" + + "} \ No newline at end of file diff --git a/app/src/test/java/com/ouxuan/oxface/OrderVerificationResultTest.java b/app/src/test/java/com/ouxuan/oxface/OrderVerificationResultTest.java index a64d9bb..b733c4f 100644 --- a/app/src/test/java/com/ouxuan/oxface/OrderVerificationResultTest.java +++ b/app/src/test/java/com/ouxuan/oxface/OrderVerificationResultTest.java @@ -56,13 +56,15 @@ public class OrderVerificationResultTest { assertEquals("订单号应该匹配", "RC20250910155115457419", response.getResult().getOrderNo()); // 验证info字段可以被正确解析为字符串 - String infoJson = gson.toJson(response.getResult().getInfo()); - JsonElement infoElement = JsonParser.parseString(infoJson); + JsonElement infoElement = response.getResult().getInfo(); // 对于次卡类型,info应该是字符串 - if (response.getResult().getOrderType() == 1 && infoElement.isJsonPrimitive()) { + if (response.getResult().getOrderType() == 1 && infoElement != null && infoElement.isJsonPrimitive()) { String bookingInfo = infoElement.getAsString(); assertEquals("预订信息应该是'平时'", "平时", bookingInfo); + + // 测试辅助方法 + assertEquals("平时", response.getResult().getInfoAsString()); } System.out.println("次卡核销测试通过: " + response.getResult().getOrderNo()); @@ -118,11 +120,10 @@ public class OrderVerificationResultTest { assertEquals("订单号应该匹配", "MC20250908145253448493", response.getResult().getOrderNo()); // 验证info字段可以被正确解析为对象 - String infoJson = gson.toJson(response.getResult().getInfo()); - JsonElement infoElement = JsonParser.parseString(infoJson); + JsonElement infoElement = response.getResult().getInfo(); // 对于年月卡类型,info应该是对象 - if (response.getResult().getOrderType() == 3 && infoElement.isJsonObject()) { + if (response.getResult().getOrderType() == 3 && infoElement != null && infoElement.isJsonObject()) { JsonObject cardInfo = infoElement.getAsJsonObject(); assertTrue("应该包含card_no字段", cardInfo.has("card_no")); @@ -131,6 +132,10 @@ public class OrderVerificationResultTest { assertEquals("卡号应该匹配", "2509085314", cardInfo.get("card_no").getAsString()); assertEquals("剩余次数应该是5", 5, cardInfo.get("rest_number").getAsInt()); + + // 测试辅助方法 + assertEquals("2509085314", response.getResult().getCardNoFromInfo()); + assertNotNull(response.getResult().getInfoAsJsonObject()); } System.out.println("年月卡核销测试通过: " + response.getResult().getOrderNo()); diff --git a/订单核销结果页面重构说明.md b/订单核销结果页面重构说明.md index 35010e6..4ef78ce 100644 --- a/订单核销结果页面重构说明.md +++ b/订单核销结果页面重构说明.md @@ -32,7 +32,40 @@ Expected BEGIN_OBJECT but was STRING at line 1 column 345 path $.data.result.inf ## 解决方案 -### 1. 重构 OrderVerificationResultActivity +### 1. 修复 PadApiService.VerifyOrderResult 数据模型 + +**核心问题修复**:将 [VerifyOrderResult](file://c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\network\api\PadApiService.java#L1287-L1322) 类中的 [info](file://c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\network\api\PadApiService.java#L1311-L1312) 字段从固定的 `VerifyOrderInfo` 对象类型改为灵活的 `JsonElement` 类型。 + +```java +// 修复前(有问题的代码) +@SerializedName("info") +private VerifyOrderInfo info; // 只能处理对象类型 + +// 修复后(正确的代码) +@SerializedName("info") +private com.google.gson.JsonElement info; // 支持字符串和对象类型 +``` + +**添加辅助方法**: +```java +// 获取字符串类型的info(次卡核销) +public String getInfoAsString() { + if (info != null && info.isJsonPrimitive()) { + return info.getAsString(); + } + return ""; +} + +// 获取对象类型的info(年月卡核销) +public JsonObject getInfoAsJsonObject() { + if (info != null && info.isJsonObject()) { + return info.getAsJsonObject(); + } + return null; +} +``` + +### 2. 重构 OrderVerificationResultActivity #### 1.1 数据结构优化 ```java