You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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端截断,可尝试通过对象引用传递(极端场景兼容方案):
    var jsonRef = DotNetObjectReference.Create(sessionJson);
    await JS.InvokeVoidAsync("initAdyenCheckoutWithRef", jsonRef);
    
    JS端处理:
    window.initAdyenCheckoutWithRef = function(jsonRef) {
        const sessionJson = jsonRef.value;
        jsonRef.dispose();
        const session = JSON.parse(sessionJson);
        // 初始化逻辑
    };
    

内容的提问来源于stack exchange,提问作者Brett JB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:03:14