2017-02-15 7 views
0

私はタイプがPersonのC#リストを持っています。このリストはJSONデータ形式に変換する必要があります。 Person C#クラスは次のようになります。リストAをリストBと同じように設定するには、B上に存在するプロパティは存在しません。A

public class Person 
    { 
     public int ID { get; set; } 
     public static int PSID = 1; 
     public string name { get; set; } 
     public string nameToken { get; set; } 
     public double DOB { get; set; } 
     public List<Award> awards { get; set; } 
     public List<Link> links { get; set; } 

     public Person() 
     { 

      awards = new List<Award>(); 
      links = new List<Link>(); 
      ID = PSID; 
      PSID++; 
     } 


    } 

人のC#リストをJSONに変換する必要があります。私はPersonJSと呼ばれるC#で別のクラスを作った。唯一の違いは、JSONフロントエンドでは不要なプロパティの一部を削除したことです。これはPerson C#クラスとまったく同じです。すなわち:nameToken、PSID。

public class PersonJS 
{ 

    public int ID { get; set; } 

    public string name { get; set; } 

    public double DOB { get; set; } 

    public List<AwardJS> awards { get; set; } 

    public List<Link> links { get; set; } 


} 

PersonJSのプロパティの1つは、タイプAwardJSである賞と呼ばれるリストです。 Person.awards ListをPersonJS.awards Listと同じにしようとするので、以下の問題が発生します。しかし、それらは相違型であるため、両方のリストを等しくすることはできません。なぜなら、JSONデータがC#で使用したすべてのプロパティを必要としないからです。そこで私はAwardとAwardJSという2つのクラスを作りました。唯一の違いは、AwardにはfilmWebTokenというプロパティが含まれていますが、AwardJSには含まれていないという点です。私のコードで

public class Award 
    { 

    public int filmID { get; set; } 

    public int categoryID { get; set; } 

    public string filmWebToken { get; set; } 
} 



public class AwardJS 
{ 

    public int filmID { get; set; } 

    public int categoryID { get; set; } 

} 

私はタイプのC#のリスト内のすべてのプロパティを反復処理し、私はpersonjsオブジェクトを作成し、PersonJS C#のリストに追加しようとします。 PersonJSのリストは、JSONとしてフロントエンドに戻されます。ただし、PersonJSクラスの特典プロパティがPersonの特典プロパティと異なるため、「暗黙のうちにAwardJSタイプを賞品に変換できません」というエラーが表示されます。このエラーが発生する理由は、PersonJSにPersonクラスに存在するfilmWebTokenが含まれていないためです。 JSONデータのプロパティではないため、filmWebTokenをPersonJSリストに入れることは望ましくありません。しかし、Person.Awardにプロパティフィールドがあるので、私はまだアクセスしたいと思います:filmIDとCategoryID filmWebTokenフィールドを無視/迂回する方法はありますか? 、

public AwardJS ToAwardJS() { 
    return new AwardJS { filmID = this.filmID, categoryID = this.categoryID }; 
} 

次にあなたがPersonJSオブジェクトを作成するときに実行します:

List<Person> allPersons = DataRepository.GetAllPersons(); // contains the C# data 
     List<PersonJS> personjs = new List<PersonJS>(); // empty to start with 

     foreach (var person in allPersons) 
     { 
      foreach (var award in person.awards) 
      { 
       personjs.Add(
        new PersonJS 
        { 
         ID = person.ID, 
         links = person.links, 
         name = person.name, 
         DOB = person.DOB, 
         awards = person.awards // The types are not equal: Person contains filmWebToken whereas PersonJS does not 


        }); 



      } 


     } 
+0

ルックス'Award'タイプの関連する部分を新しい' PersonJS'に投影する方法と非常によく似た新しいAwardJSのisntanceに投影するだけです。 LINQは値を投影するための 'Select'メソッドでこれに取り組むのに良い方法です。 –

+0

Automapperはこの種のものにはかなり良いです。 http:// automapper。org/ –

+0

@AdamHouldsworthあなたは例を挙げることができます – hoChay

答えて

2

は方法がAwardToAwardJSと呼ばれる追加:これは私が試したものであるあなたが

new PersonJS 
{ 
    ID = person.ID, 
    links = person.links, 
    name = person.name, 
    DOB = person.DOB, 
    awards = person.awards.Select(x => x.ToAwardJS()).ToList(), 
}); 
0

何シリアライザを使用して?大部分は、直列化にどのメンバを含めるかを指定する属性を提供します。たとえば、DataContractJsonSerializerは[DataContract][DataMember]を使用します。私は、Json.netが[JsonIgnore]を使うと思う。複数のクラスは必要ありません。

void Main() 
{ 
    var jsSer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(Person)); 

    var p = new Person { 
     ID = 1, 
     name = "John", 
     DOB = 1234.5, 
     nameToken = "token" 
    }; 

    string result = null; 
    using (var ms = new MemoryStream()) 
    { 
     jsSer.WriteObject(ms, p); 
     byte[] json = ms.ToArray(); 
     ms.Close(); 

     result = Encoding.UTF8.GetString(json, 0, json.Length); 
    } 

    Console.WriteLine(result); 
} 

[DataContract] 
public class Person 
{ 
    //included 
    [DataMember] 
    public int ID { get; set; } 
    [DataMember] 
    public string name { get; set; } 
    [DataMember] 
    public string nameToken { get; set; } 
    [DataMember] 
    public double DOB { get; set; } 

    //ignored 
    public static int PSID = 1; 
    public List<string> awards { get; set; } 
    public List<string> links { get; set; } 

    public Person() 
    { 

     awards = new List<Award>(); 
     links = new List<Link>(); 
     ID = PSID; 
     PSID++; 
    } 
} 

結果:

{ "DOB":1234.5、 "ID":1、 "名前": "ジョン"、 "nameToken": "トークン"}

関連する問題