Неизвестный размер / атрибуты WCF DataContract при десериализации - PullRequest
0 голосов
/ 05 августа 2020

У меня сейчас есть DataContract для полезной нагрузки, которую я получаю от API. Проблема в том, что поля, возвращаемые в поле ad, не всегда одинаковы. Иногда у них есть WelcomeTitle, иногда нет. Иногда он имеет FeatureDesc1, а иногда нет. Есть ли способ заставить это поле [DataMember(Name = "ad")] каким-либо образом учитывать различные поля, которые могут возвращаться из API?

Одна идея, которая у меня была до сих пор, заключалась в том, что я мог десериализовать весь ответ в словарь JsonConvert.DeserializeObject<Dictionary<string, object>>(stringJson); . Но я бы предпочел, чтобы весь ответ был объектом, на который я могу воздействовать.

Спасибо!

namespace something
{
    [DataContract]
    public class MyPayload
    {   
        [DataMember(Name = "v")]
        public string Version { get; set; }

        [DataMember(Name = "ad")]
        public IntroAd Properties { get; set; }

        [DataMember(Name = "tracking")]
        public IntroBeacons Tracking { get; set; }
    }

    [DataContract]
    public class IntroAd // Not always guaranteed to have the same members
    {
        [DataMember(Name = "WelcomeTitle")]
        public string WelcomeTitle { get; set; }

        [DataMember(Name = "WelcomeSubtitle")]
        public string WelcomeSubtitle { get; set; }

        [DataMember(Name = "CallToAction")]
        public string CallToAction { get; set; }

        [DataMember(Name = "FeatureTitle0")]
        public string FeatureTitle0 { get; set; }

        [DataMember(Name = "FeatureDesc0")]
        public string FeatureDesc0 { get; set; }

        [DataMember(Name = "FeatureTitle1")]
        public string FeatureTitle1 { get; set; }

        [DataMember(Name = "FeatureDesc1")]
        public string FeatureDesc1 { get; set; }

        [DataMember(Name = "FeatureTitle2")]
        public string FeatureTitle2 { get; set; }

        [DataMember(Name = "FeatureDesc2")]
        public string FeatureDesc2 { get; set; }
    }

    [DataContract]
    public class IntroBeacons
    {
        [DataMember(Name = "baseUri")]
        public Uri Uri { get; set; }
    }
}
...