如何使用 jsonapi 1.0 在 Attribute 中映射复杂类型

时间:2021-01-01 11:19:52

标签: c# json deserialization

我有一个类 SubscriptionType,它的属性是一个复杂的类,称为 InfoTextLongInfoTextName,它们都有 en 和 {{1 }} 财产。 当我使用 ur 库从 wep api 反序列化我的 json 时。检索所有对象,期望属性中存在的复杂类型。显示空值。 我尝试使用我自己的解析器,但没有用。有人可以帮助我吗?谢谢

我的解析器

JsonApiNet 3.0.0

我的类型

 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;
}

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

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; }
    }

1 个答案:

答案 0 :(得分:0)

我没有在 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; }
    }
相关问题