ASP.NET Web API正在显示我不要求的JSON对象

时间:2019-04-04 09:29:04

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

我有一个使用ASP.NET的Web API,我试图返回一些数据,但是由于它引用的是我不想被引用的对象,因此会引起问题。

在这种情况下,类结构如下:

实体(实体),装备(团队)和电子竞技(体育)

一个实体有很多团队,而一个团队只有一个 Sport

我正在使用实体框架,并且对象具有两种关系; 运动具有许多团队,而团队具有一个实体

这是我要获取具有其团队的实体以及每个团队及其运动的查询。

 entitats _entitat = (
                   from e in db.entitats
                       .Include("equips.esports")
                   where e.id == id
                   select e
               ).FirstOrDefault();

这应该正是我想要的,问题是在第一个团队中,当向我展示运动时,运动包含所有具有相同运动的其他团队(来自该实体),然后是时间将它们显示在Team数组上,它使用$ ref和$ id。

"$id": "1",
"equips": [
    {
        "$id": "2",
        "activitats_concedides": [],
        "activitats_demanades": [],
        "categories": null,
        "categories_competicio": null,
        "competicions": null,
        "entitats": {
            "$ref": "1"
        },
        "esports": {
            "$id": "3",
            // These shouldn't even be here
            "equips": [
                {
                    "$ref": "2"
                },
                {
                    "$id": "4",
                    "activitats_concedides": [],
                    "activitats_demanades": [],
                    "categories": null,
                    "categories_competicio": null,
                    "competicions": null,
                    "entitats": {
                        "$ref": "1"
                    },
                    "esports": {
                        "$ref": "3"
                    },
                    "sexes": null,
                    "id": 8,
                    "nom": "Test 2",
                    "id_entitat": 1,
                    "id_categoria": 3,
                    "id_esport": 1,
                    "id_competicio": 2,
                    "id_categoria_competicio": null,
                    "id_sexe": 3,
                    "borrat": false
                },
                {
                    "$id": "5",
                    "activitats_concedides": [],
                    "activitats_demanades": [],
                    "categories": null,
                    "categories_competicio": null,
                    "competicions": null,
                    "entitats": {
                        "$ref": "1"
                    },
                    "esports": {
                        "$ref": "3"
                    },
                    "sexes": null,
                    "id": 9,
                    "nom": "Test 3",
                    "id_entitat": 1,
                    "id_categoria": 2,
                    "id_esport": 1,
                    "id_competicio": 2,
                    "id_categoria_competicio": null,
                    "id_sexe": 2,
                    "borrat": false
                },
                {
                    "$id": "6",
                    "activitats_concedides": [],
                    "activitats_demanades": [],
                    "categories": null,
                    "categories_competicio": null,
                    "competicions": null,
                    "entitats": {
                        "$ref": "1"
                    },
                    "esports": {
                        "$ref": "3"
                    },
                    "sexes": null,
                    "id": 10,
                    "nom": "prova",
                    "id_entitat": 1,
                    "id_categoria": 3,
                    "id_esport": 1,
                    "id_competicio": 2,
                    "id_categoria_competicio": null,
                    "id_sexe": 2,
                    "borrat": false
                }
            ],
            "id": 1,
            "nom": "Futbol"
        },
        "sexes": null,
        "id": 3,
        "nom": "Test 1",
        "id_entitat": 1,
        "id_categoria": 6,
        "id_esport": 1,
        "id_competicio": 1,
        "id_categoria_competicio": null,
        "id_sexe": 1,
        "borrat": false
    },
    {
        "$ref": "4" // These should be the "full" objects
    },
    {
        "$ref": "5"
    },
    {
        "$ref": "6"
    }
],
"telefons": [],
"id": 1,
"nom": "Futbol Club Sant Cugat del Valles",
"direccio": "Sample Carrer 1",
"cif": "B12345678",
"temporada": "2019                ",
"correu": "entitat1@test.com",
"facebook": null,
"instagram": null,
"twitter": null,
"password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
"borrat": true}

我没有问每个运动队,所以我不知道为什么要向他们展示。团队实体也会发生同样的情况,在这种情况下,这不是问题,因为它不会干扰输出,但在其他情况下,这是一个问题。我想它的作用是,如果显示的是您“询问”的对象尽可能靠近顶部,然后在实际需要它们的地方,它只是引用。

如果你们知道出了什么问题,我将非常感谢。谢谢!

PD:我尝试过更改此选项没有成功,这只会使情况变得更糟。

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;

1 个答案:

答案 0 :(得分:0)

您的问题源于对数据关系的过于宽容。 有两种解决方法:

  1. 按顺序获取数据关系。一个示例是您的Sport对象,它不需要链接到任何团队。您有团队,很棒,每个团队都有与之相关的一项运动,这就是运动的终点,只有一对一的关系,仅此而已。然后,您可以轻松地建立查询,以向您显示所有具有特定运动相关联的团队。

  2. 按原样保留结构,但是添加一些DTO以从API返回,公平的说,这是您首先应该执行的操作,无论选择哪种方法。您永远不要返回Entity Framework对象的原因之一是因为它们带有不需要的各种数据。

因此,在查询中进行选择的地方,构建一个DTO,该DTO仅包含您想要的字段,然后返回该字段即可解决问题。

select e变为

select new EntityDTO {
     assign whatever fields you need here
}

这样,您就可以断开与实体框架对象及其所有依赖关系的链接。

做一些类似的阅读工作:https://entityframework.net/knowledge-base/12568587/linq-to-sql-select-into-a-new-class