C# 如何使用DataContractJsonSerializer从web获取的数据(以JSON的形式)设置对象的属性子集
我正在制作一个旅游应用程序项目,包括一个用PHP编码的后端和一个用C#编码的UWP应用程序(前端) 下面是用C实现的“Holiday Package”类# 我想将上面的JSON字符串反序列化到“Packages”类中,从而设置其“PackageID”、“Name”、“Destination”、“Description”、“Duration”和“BasePrice”属性,即我只想使用web数据设置属性的子集 如何使用DataContractJsonSerializer类实现上述解决方案C# 如何使用DataContractJsonSerializer从web获取的数据(以JSON的形式)设置对象的属性子集,c#,.net,json,datacontractjsonserializer,C#,.net,Json,Datacontractjsonserializer,我正在制作一个旅游应用程序项目,包括一个用PHP编码的后端和一个用C#编码的UWP应用程序(前端) 下面是用C实现的“Holiday Package”类# 我想将上面的JSON字符串反序列化到“Packages”类中,从而设置其“PackageID”、“Name”、“Destination”、“Description”、“Duration”和“BasePrice”属性,即我只想使用web数据设置属性的子集 如何使用DataContractJsonSerializer类实现上述解决方案 我需要添加
我需要添加/修改任何构造函数吗?
DataContractJsonSerializer
将永远不会调用参数化构造函数。因此,就目前而言,由于您的包
类型缺少无参数构造函数,它会抛出一个异常,因为它不知道如何构造此类类型的实例
有两种方法可以启用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;
}
}
这是因为,对于数据协定类型,数据协定序列化程序
在为
包
(可能还有HotelInPackage
(问题中未包括)实现了这两个选项之后,现在可以反序列化JSON了。只设置JSON中实际存在的属性。DataContractJsonSerializer
永远不会调用参数化构造函数。因此,就目前而言,由于您的包
类型缺少无参数构造函数,它会抛出一个异常,因为它不知道如何构造此类类型的实例
有两种方法可以启用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;
}
}
这是因为,对于数据协定类型,数据协定序列化程序
在为包
(可能还有HotelInPackage
(问题中未包括)实现了这两个选项之后,现在可以反序列化JSON了。只设置JSON中实际存在的属性
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]
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;
}
}