Blazor WASM集成Adyen支付时JSON反序列化异常求助
解决方案
1. 替换ASCII编码为UTF-8读取响应
ASCII编码仅支持0-127范围的字符,而JSON默认采用UTF-8编码,若响应中存在任何超出ASCII范围的字符(哪怕是ISO日期格式的符号也可能因编码处理不当被截断),都会导致内容丢失。直接改用UTF-8编码读取响应字节:
// 替换原有的Encoding.ASCII.GetString()逻辑 var sessionJson = Encoding.UTF8.GetString(responseBytes);
2. 直接传递JSON字符串给JS互操作
跳过手动字节数组或自定义对象转换环节,直接将完整的JSON字符串传给JS,避免中间转换导致的截断:
- C#端调用JS互操作:
await JS.InvokeVoidAsync("initAdyenCheckout", sessionJson); - JS端直接解析并使用:
window.initAdyenCheckout = function(sessionJson) { const session = JSON.parse(sessionJson); // 初始化Adyen Checkout逻辑 const checkout = new AdyenCheckout({ session }); // 后续渲染支付组件等操作 };
3. 绕过官方C#对象反序列化问题
如果Adyen官方提供的C#类无法正常反序列化响应,可使用JsonElement或动态类型接收响应,再直接序列化为JSON字符串:
- 使用
JsonElement(类型安全且高效,推荐):var sessionElement = await httpClient.GetFromJsonAsync<JsonElement>("your-adyen-session-api-endpoint"); var sessionJson = sessionElement.ToString(); - 使用动态类型:
dynamic session = await httpClient.GetFromJsonAsync<dynamic>("your-adyen-session-api-endpoint"); var sessionJson = System.Text.Json.JsonSerializer.Serialize(session);
4. 排查截断根源
- 在C#端输出
sessionJson的完整内容,确认是否在读取响应阶段就已截断:若已截断,检查服务器返回的Content-Length头部与实际接收字节数是否一致,排除响应本身不完整的问题。 - 若C#端内容完整但JS端截断,可尝试通过对象引用传递(极端场景兼容方案):
JS端处理:var jsonRef = DotNetObjectReference.Create(sessionJson); await JS.InvokeVoidAsync("initAdyenCheckoutWithRef", jsonRef);window.initAdyenCheckoutWithRef = function(jsonRef) { const sessionJson = jsonRef.value; jsonRef.dispose(); const session = JSON.parse(sessionJson); // 初始化逻辑 };
内容的提问来源于stack exchange,提问作者Brett JB
相关产品推荐
相关产品推荐

