2016-10-11 9 views
1

PHPでコーディングされたバックエンドとC#でコーディングされたUWPアプリケーション(フロントエンド) 。続きDataContractJsonSerializerを使用してWebから取得したデータ(JSON形式)を使用してオブジェクトのプロパティのサブセットを設定する方法

は、私は、「パッケージの中に上記のJSON文字列をデシリアライズしたいバックエンド

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

で返されるJSON文字列で次の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++; 
     } 
    } 
} 

で実装「ホリデーパッケージ」クラスを表します「PackageID」、「Name」、「Destination」、「Description」、「Duration」、「BasePrice」のプロパティを設定します。つまり、Webデータを使用してプロパティのサブセットのみを設定します。

DataContractJsonSerializerクラスを使用して上記のソリューションを実装する方法は?

コンストラクタを追加/変更する必要がありますか?

答えて

0

DataContractJsonSerializerは、パラメータ化されたコンストラクタを呼び出すことはありません。したがって、そのままでは、Packages型にはパラメータのないコンストラクタがないため、そのような型のインスタンスを作成する方法がわからないため、例外がスローされます。

DataContractJsonSerializerにオブジェクトを作成する2つの方法があります。まず、パラメータのないコンストラクタを追加できます。それも、民間のようになります。

また
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; 
    } 
} 

これが機能するために、ので、データコントラクトタイプ、データコントラクトシリアライザdoes not call any constructor at all

これらのオプションのいずれかをPackagesに実装すると(質問に含まれていないHotelInPackage)、JSONをデシリアライズできるようになりました。 JSONに実際に存在するプロパティだけが設定されます。

関連する問題