Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用DataContractJsonSerializer从web获取的数据(以JSON的形式)设置对象的属性子集_C#_.net_Json_Datacontractjsonserializer - Fatal编程技术网

C# 如何使用DataContractJsonSerializer从web获取的数据(以JSON的形式)设置对象的属性子集

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类实现上述解决方案 我需要添加

我正在制作一个旅游应用程序项目,包括一个用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;
    }
}