【问题标题】:how to map complex type in Attribute with jsonapi 1.0如何使用 jsonapi 1.0 映射属性中的复杂类型
【发布时间】:2023-03-04 19:57:01
【问题描述】:

我有一个类SubscriptionType,它的属性是一个复杂的类,称为InfoTextLongInfoTextName,它们都有enur 属性。 当我使用 JsonApiNet 3.0.0 库从 wep api 反序列化我的 json 时。检索所有对象,除了属性中存在的复杂类型。显示空值。 我曾尝试使用我自己的解析器,但它不起作用。有人可以帮助我吗?谢谢

我的解析器

 public class NamingThingsIsHardResolver : JsonApiPropertyResolver
    {
        public override PropertyInfo ResolveJsonApiAttribute(Type type, string attributeName)
        {
            if (type == typeof(SubscriptionType) && attributeName == "name")
            {
                return type.GetProperty("Name");
            }

            return base.ResolveJsonApiAttribute(type, attributeName);
        }
    }

我的类型

public class Subscription
{
    public string Id { get; set; }
    public string ContractId { get; set; }
    public string PaymentType { get; set; }
    public string Status { get; set; }
    public SubscriptionType SubscriptionType { get; set; }
}
    public class SubscriptionType
{
    public string Id { get; set; }      
    public string BusinessModelType { get; set; }
    public InfoText InfoText;
    public string LineType { get; set; }
    public LongInfoText LongInfoText;
     //[JsonApiRelationship("name")] // [JsonApiAttribute("name")] //also not working
    public string Name;
}

我的复杂类型

public class Name 
{ 
    public string En { get; set; } 
    public string Ur { get; set; } 
}

 public class InfoText
    {
        public string En { get; set; }
        public string Ur { get; set; }
    }

 public class LongInfoText
    {
        public string En { get; set; }
        public string Ur { get; set; }
    }

我的 json 这个json被简化了。删除了一些属性和关系

 {
    "data": [
        {
            "attributes": {
                "contract-id": "103",
                "payment-type": "prepaid",
                "status": "active",
            },
            "id": "103",
            "links": {
                "self": "/api/v1/subscriptions/103"
            },
            "relationships": {              
                "subscription-type": {
                    "data": {
                        "id": "1",
                        "type": "subscription-types"
                    },
                    "links": {
                        "related": "/api/v1/subscriptions/103/subscription-type"
                    }
                }
                
            },
            "type": "subscriptions"
        }
    ],
    "included": [
        {
            "attributes": {
                "business-model-type": "prepaid",
                "info-text": {
                    "en": null,
                    "ur": null
                },
                "line-type": "mobile",
                "long-info-text": {
                    "en": null,
                    "ur": null
                },
                "name": {
                    "en": "Start prepaid",
                    "ur": "Start Prepaid"
                }
            },
            "id": "1",
            "links": {
                "self": "/api/v1/subscription-types/1"
            },
            "relationships": {
                "billing-rate-plans": {
                    "links": {
                        "related": "/api/v1/subscription-types/1/billing-rate-plans"
                    }
                }
            },
            "type": "subscription-types"
        }
    ]
}

【问题讨论】:

    标签: c# json deserialization


    【解决方案1】:

    我在 JsonApiNet 库中没有找到解决方案,所以我创建了一个如下所示的 json 反序列化器。我对此不满意,但它有效。请改进这个答案谢谢。

    我在 SubscriptionType.cs 中的方法

     public void InjectAttributes(JsonApiAttributes attributes) {
    
                // InfoText
                var infoText = attributes["info-text"].ToString();
                InfoText = JsonConvert.DeserializeObject<Lang>(infoText);
    
                // LongInfoText
                var longInfoText = attributes["long-info-text"].ToString();
                LongInfoText = JsonConvert.DeserializeObject<Lang>(longInfoText);
    
                // Name
                var name = attributes["name"].ToString();
                Name = JsonConvert.DeserializeObject<Lang>(name);
    
            }
    

    我这样称呼它。

    var document = JsonApi.Document<List<Subscription>>(response.Content.ReadAsStringAsync().Result);
    
    List<Subscription> subscriptions = document.Resource;
    
    foreach (var subscription in subscriptions)
    {
        subscription.SubscriptionType.InjectAttributes(document.Included[0].Attributes);
    }
    

    还创建了一个单独的 c# 对象类

    public class Lang
        {
            public string En { get; set; }
            public string Ur { get; set; }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2022-01-12
      • 2016-06-04
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2016-06-14
      相关资源
      最近更新 更多