[英]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.