赵明涛 4 days ago
parent
commit
f4fc2554a7
  1. 47
      app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java
  2. 3
      app/src/main/java/com/ouxuan/oxface/orderOX/OrderVerificationResultActivity.java
  3. 89
      app/src/test/java/com/ouxuan/oxface/JsonParsingVerification.java
  4. 17
      app/src/test/java/com/ouxuan/oxface/OrderVerificationResultTest.java
  5. 35
      订单核销结果页面重构说明.md

47
app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java

@ -1310,7 +1310,7 @@ public interface PadApiService {
private java.util.List<String> 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<String> getVCode() { return vCode; }
public void setVCode(java.util.List<String> 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; }

3
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();
}

89
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" +
"}

17
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());

35
订单核销结果页面重构说明.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

Loading…
Cancel
Save