Web api在返回客户端时跳过所有对象,但首先在List <t>中

时间:2016-08-31 06:45:56

标签: c# json asp.net-web-api json.net

我有一个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在列表中有多个对象

当客户端收到列表时,除第一个对象外都是空的。 我已经尝试将对象恢复为Ok(CanDeleteRumsaAttributeResponse)并且我尝试将其序列化为:

        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;

在第二种情况下,我可以搜索json字符串并找到丢失的数据。 所以它在第二种情况下被序列化了。

我已经检查过fiddler以查看发送的内容,我可以看到json-data中的内容不正确。

缺少的对象获得的值如$ ref:&#34; 4&#34;等等,但没有别的。

这是json-string我害怕我不知道如何正确地为Stackoverflow格式化它,但我认为信息也存在,但是当我使用查看器查看它时,它不是和它肯定不会反序列化到正确的对象。

对象中的另一个列表可以包含任意数量的对象,它们都可以正常返回。此外,其他端点正在返回完全相同类型的列表。 这三个对象在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"}]}

1 个答案:

答案 0 :(得分: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 anotation包含在实体集中。

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