簡體   English   中英

如何使用DataContractJsonSerializer使用從Web(以JSON形式)獲取的數據設置對象屬性的子集

[英]How to set a subset of properties of an object using data obtained from web (in form of JSON) using DataContractJsonSerializer

我正在制作一個旅行應用程序項目,包括用PHP編碼的后端和用C#編碼的UWP應用程序(前端)。

以下代表用C#實現的“Holiday Package”類

 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字符串反序列化為“Packages”類,從而設置其“PackageID”,“Name”,“Destination”,“Description”,“Duration”和“BasePrice”屬性,即我只想設置一個子集使用網絡數據的屬性

如何使用DataContractJsonSerializer類實現上述解決方案?

我是否需要添加/修改任何構造函數?

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中實際存在的那些屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM