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

XML RPC转C#强类型类失败,请求排查模型映射问题

排查XML-RPC转C#强类型类的匹配问题

咱们先对比你的模型和实际XML-RPC数据的结构,就能清晰看到问题出在哪了:

核心结构不匹配的点

  • 属性名称完全错位:你定义的aw_gift_cards_used类里有个aw_gift_card_used属性,但实际XML里,aw_gift_cards_used对应的struct中,成员名称是27(看起来像是动态关联ID),根本没有aw_gift_card_used这个键。
  • 数组与对象的理解偏差:XML里27对应的value是一个混合类型数组,里面包含字符串、布尔值、nil和两个礼品卡结构体;但你的模型把GiftCards当成了单对象,完全没处理数组结构。
  • core_abstract的位置错误:XML里core_abstract是数组的第一个字符串元素,并非某个类的属性,你把它放到GiftCards类里完全不符合实际结构。

修正后的C#模型

结合XML-RPC的特性,我调整了模型,能正确匹配你的数据:

using CookComputing.XmlRpc;

[XmlRpcMissingMapping(MappingAction.Ignore)]
public class AwGiftCardsUsedResponse
{
    // 精准映射XML里的aw_gift_cards_used成员
    [XmlRpcMember("aw_gift_cards_used")]
    public Dictionary<string, GiftCardDataArray> GiftCardsUsed { get; set; }
}

[XmlRpcMissingMapping(MappingAction.Ignore)]
public class GiftCardDataArray
{
    // 接收XML-RPC数组里的所有混合类型元素
    public object[] Items { get; set; }

    // 提供方法提取数组中的礼品卡对象
    public List<GiftCard> ExtractGiftCards()
    {
        var giftCards = new List<GiftCard>();
        if (Items == null || Items.Length < 10) return giftCards;
        
        // 根据你提供的XML,第9、10个元素(索引8、9)是礼品卡结构体
        if (Items[8] is GiftCard card1) giftCards.Add(card1);
        if (Items[9] is GiftCard card2) giftCards.Add(card2);
        
        return giftCards;
    }
}

[XmlRpcMissingMapping(MappingAction.Ignore)]
public class GiftCard
{
    [XmlRpcMember("link_id")]
    public string LinkId { get; set; }
    
    [XmlRpcMember("giftcard_id")]
    public string GiftCardId { get; set; }
    
    [XmlRpcMember("quote_id")]
    public string QuoteId { get; set; }
    
    [XmlRpcMember("base_giftcard_amount")]
    public string BaseGiftCardAmount { get; set; }
    
    [XmlRpcMember("giftcard_amount")]
    public string GiftCardAmount { get; set; }
    
    [XmlRpcMember("code")]
    public string Code { get; set; }
    
    [XmlRpcMember("balance")]
    public string Balance { get; set; }
}

关键调整说明

  1. 用Dictionary处理动态键:XML里的27是动态值(比如订单ID),用Dictionary<string, GiftCardDataArray>可以兼容任意键名的情况,不会因为键变化导致映射失败。
  2. 数组用object[]接收:XML-RPC数组混合了多种数据类型,无法直接用强类型属性对应每个位置,先统一用object[]接收,再通过方法提取需要的礼品卡对象。
  3. 精确标注XmlRpcMember:每个属性都用XmlRpcMember指定XML里的成员名称,避免因命名规范差异(如下划线与驼峰)导致匹配失败。

内容的提问来源于stack exchange,提问作者Joseph Anderson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:20:40