2016-08-31 2 views
0

に戻ったときに最初にリスト に私はこのようになり、複雑なオブジェクトを返すWeb APIを持っています。 のWeb APIは、すべてのオブジェクトをスキップしますが、クライアント

public class CanDeleteRumsaAttributeResponse 
{ 
    public CanDeleteRumsaAttributeResponse() 
    { 

    } 
    public CanDeleteRumsaAttributeResponse(int attributeId) 
    { 
     RumsaAttributeId = attributeId; 
    } 

    public int RumsaAttributeId { get; set; } 

    public bool AttributeFound { get; set; } 
    public List<RumsaRoom> AffectedRumsaRooms { get; set; } = new List<RumsaRoom>(); 
    public List<RumsaAttribute> AffectedLinkedRumsaAttributes { get; set; } = new List<RumsaAttribute>(); 
    [JsonIgnore] 
    public bool CanDelete 
    { 
     get 
     { 
      return AffectedRumsaRooms.Count == 0&&AttributeFound&&AffectedLinkedRumsaAttributes.Count==0; 
     } 
    } 

} 

私はそれをデバッグするとき、私はそのコントローラのリターンを見ることができますリストAffectedLinkedRumsaAttributesがリスト内に複数のオブジェクトを持っていること

クライアントがリストを受信すると、最初のオブジェクトを除くすべてのオブジェクトがnullになります。 私はOK(CanDeleteRumsaAttributeResponse)としてオブジェクトを返す試みたと私はこのようにそれをシリアル化しようとしました:私は、JSON文字列を検索し、失われたデータを見つけることができる第2のケースで

 RoomAttributesUtils utils = new RoomAttributesUtils(db); 
     string json = JsonConvert.SerializeObject(utils.GetCanDeleteColor(id)); 
     var response = this.Request.CreateResponse(HttpStatusCode.OK); 
     response.Content = new StringContent(json, Encoding.UTF8, "application/json"); 
     return response; 

。 そのため、2番目のケースではシリアル化されています。

何が送信されているかを確認するために、フィドラーを確認しましたが、何かがjson-dataに正しくないことがわかります。

欠落しているオブジェクトは$ ref: "4"などの値を取得しますが、それ以外は何も取得しません。

ここにjson-stringがあります。私はStackoverflowのために正しくフォーマットする方法がわかりませんが、情報もそこにあると思いますが、ビューアを使用して見ると、正しいオブジェクトにデシリアライズしないでください。

オブジェクトの他のリストには、任意の数のオブジェクトを含めることができ、すべてが正常に戻ります。また、他のエンドポイントは同じ型のリストを完全にうまく返します。 3つのオブジェクトは、Codeプロパティで一意の値を持ち、V30、V31、V12です(json文字列でそれらを識別する場合)。

アイデア?

ここ

は、JSON文字列

{"RumsaAttributeId":4797,"AttributeFound":true,"AffectedRumsaRooms":[{"$id":"1","RoomName":"STÄD","RoomNumber":"U12102-1150","Building":"U1","PartOfBuilding":"21","Plan":"02","Number":"1150","RoomDescriptions":[],"IsDeleted":false,"PMs":[],"IDNR":"175D_40","Exclude":false,"Department":"VN40 Lokalvård","Comments":"","Area":"23.19","HygeneClass":null,"CeilingHeight":"","UniqueRoomId":"d00e5325-7918-4d01-b273-813a770b46ca-010591d3","SolviegHasOpenedThis":true,"LastSynchedFromRevit":"1900-01-01T00:00:00","LastUpdatedFromRevit":"1900-01-01T00:00:00","Id":25772}],"AffectedLinkedRumsaAttributes":[{"$id":"2","AMACode":"KBC.3211","Malning":"56-03510","AvaliableColors":[{"$id":"3","AvaliableMaterials":[{"$ref":"2"},{"$id":"4","AMACode":"MBE.221","Malning":"-","AvaliableColors":[{"$ref":"3"}],"RoomDescriptions":[],"Code":"V30","ShortDescription":"Kakel, vattenavvisande beklädnad","LongDescription":"-","Comment":"-","PartOfRoom":null,"PartOfRoomId":960,"Id":1438},{"$id":"5","AMACode":"MBE.222","Malning":"-","AvaliableColors":[{"$ref":"3"}],"RoomDescriptions":[],"Code":"V31","ShortDescription":"Kakel, vattentät beklädnad","LongDescription":"-","Comment":"-","PartOfRoom":null,"PartOfRoomId":960,"Id":1439}],"RoomDescriptions":[],"Code":"V31_01","ShortDescription":"Kakel, vattentät beklädnad","LongDescription":"Marazzi SistemC Arch ME83, kulör Bianco(vit)200x200x5 mm. Fog Mapei Ultracolor Plus kulör 111 Silver Grey","Comment":"På 1 fondvägg","PartOfRoom":null,"PartOfRoomId":960,"Id":4797}],"RoomDescriptions":[],"Code":"V12","ShortDescription":"Gipsskivor, hygienklass 2","LongDescription":"Hög standard, hygienklass 2\n","Comment":"-","PartOfRoom":null,"PartOfRoomId":960,"Id":1425},{"$ref":"4"},{"$ref":"5"}]} 
+0

'$のref'は、あなたが送っている実際の値であると考えますか?それともバグですか? –

+0

$ refは私がビューアで読むことができるものですが、今私は再びそれを見ています。私はImがそこで誤っていると思います。$ refは何か他のものです、彼らはjsonの文字列にseparetly存在します。 デシリアライザのように2つのオブジェクトをスキップします。 – Erik83

+0

シリアル化するときは、['PreserveReferencesHandling'](http://www.newtonsoft.com/json/help/html/preserveobjectreferences.htm)を有効にする必要があります。この機能は、オブジェクトグラフ内のすべてのオブジェクト参照を追跡します。オブジェクトが複数回出現すると、最初のオブジェクト(参照している '$ ref')への参照でタグ付けされます。同じ設定でデシリアライズするか、サーバー上で無効にする必要があります。 – dbc

答えて

1

である私は、私が原因循環参照に、シリアル化が完了しなかったことが判明した似たような状況がありました。

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Url { get; set; } 

    public List<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogForeignKey { get; set; } 

    [ForeignKey("BlogForeignKey")] 
    public Blog Blog {get;set;} 

} 

私は親関係から子関係を削除し、エンティティセットにforeingkeyアノテーションを含めました。

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Url { get; set; } 

    [ForeignKey("BlogForeignKey")] 
    public List<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogForeignKey { get; set; } 
} 

またLoopReferenceHandling

関連する問題