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

本文关键字:List 返回 客户端 api 对象 Web | 更新日期: 2023-09-27 18:05:06

我有一个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(candeleterumsaattributerresponse),我试过像这样序列化它:

        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: "4"等值,但没有其他值。

这是json字符串,我恐怕我不知道如何正确地格式化它的Stackoverflow,但我认为,信息也有,但当我看它使用查看器,它不是,它肯定不会反序列化到正确的对象。

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

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

我有一个类似的情况,我发现由于循环引用,序列化没有完成。

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