Как установить подмножество свойств объекта, используя данные, полученные из Интернета (в форме JSON) с помощью DataContractJsonSerializer

Я делаю проект приложения для путешествий, состоящий из бэкэнда, написанного на PHP, и приложения UWP (интерфейса), написанного на C#.

Ниже представлен класс Holiday Package, реализованный на C#.

 public class Packages
{
    public string PackageID { get; set; }
    public string Name { get; set; }
    public string Destination { get; set; }
    public string Description { get; set; }
    public int Duration { get; set; }
    public float BasePrice { get; set; }
    public List<string> Images { get; set; }

    public HotelInPackage Hotel { get; set; }

    public string TransportType { get; set; }

    public Packages(string packageID,string name,string destination,string description,int duration,float basePrice,List<string> images)
    {
        PackageID = packageID;
        Name = name;
        Destination = destination;
        Description = description;
        Duration = duration;
        BasePrice = basePrice;
        Images = images;
    }

    public void HotelConstruct(string hotelID,string name,int cat)
    {
        Hotel = new HotelInPackage(hotelID, name, cat);
    }

    public void SetTransport(string transportType)
    {
        TransportType = transportType;
    }

    public void ChangeImageName()
    {
        int i = 0;
        while(i<Images.Count)
        {
            Images[i] = string.Format("Assets/CitiesPlaceholder/{0}.jpg",Images[i]);
            i++;
        }
    }
}

Ниже приведена строка JSON, возвращаемая серверной частью.

{
"PackageID":"P280",
"Name":"Sigapore Dreams",
"Destination":"Singapore",
"Description":"lorem ipsum,dolor sit amet",
"Duration":5,
"BasePrice":999.2
}

Я хочу десериализовать приведенную выше строку JSON в класс «Пакеты», тем самым установив его свойства «PackageID», «Name», «Destination», «Description», «Duration» и «BasePrice», т.е. я хочу установить только подмножество свойства, использующие веб-данные

Как реализовать вышеуказанное решение с помощью класса DataContractJsonSerializer?

Нужно ли мне добавлять/изменять какой-либо конструктор?


person Aman Saxena    schedule 11.10.2016    source источник


Ответы (1)


DataContractJsonSerializer никогда не вызовет параметризованный конструктор. Таким образом, поскольку в вашем типе Packages отсутствует конструктор без параметров, он генерирует исключение, потому что не знает, как создать экземпляр такого типа.

У вас есть два способа включить DataContractJsonSerializer для создания вашего объекта. Во-первых, вы можете добавить конструктор без параметров. Это может быть даже личное:

public class Packages
{
    public string PackageID { get; set; }
    public string Name { get; set; }
    public string Destination { get; set; }
    public string Description { get; set; }
    public int Duration { get; set; }
    public float BasePrice { get; set; }
    public List<string> Images { get; set; }

    public HotelInPackage Hotel { get; set; }

    public string TransportType { get; set; }

    Packages()
    {
        Debug.WriteLine("Calling private constructor of " + GetType().FullName);
    }

    public Packages(string packageID, string name, string destination, string description, int duration, float basePrice, List<string> images)
    {
        PackageID = packageID;
        Name = name;
        Destination = destination;
        Description = description;
        Duration = duration;
        BasePrice = basePrice;
        Images = images;
    }
}

В качестве альтернативы, если вам не нужен даже частный конструктор без параметров, вы можете пометить свой тип с помощью [DataContract] и [DataMember] атрибуты:

[DataContract]
public class Packages
{
    [DataMember]
    public string PackageID { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Destination { get; set; }
    [DataMember]
    public string Description { get; set; }
    [DataMember]
    public int Duration { get; set; }
    [DataMember]
    public float BasePrice { get; set; }
    [DataMember]
    public List<string> Images { get; set; }

    [DataMember]
    public HotelInPackage Hotel { get; set; }

    [DataMember]
    public string TransportType { get; set; }

    public Packages(string packageID, string name, string destination, string description, int duration, float basePrice, List<string> images)
    {
        PackageID = packageID;
        Name = name;
        Destination = destination;
        Description = description;
        Duration = duration;
        BasePrice = basePrice;
        Images = images;
    }
}

Это работает, потому что для типов контрактов данных сериализатор контрактов данных вообще не вызывает никакого конструктора.

Реализовав любой из этих вариантов для Packages (и, возможно, HotelInPackage, который не входит в вопрос), теперь вы можете десериализовать свой JSON. Будут установлены только те свойства, которые фактически присутствуют в JSON.

person dbc    schedule 11.10.2016