首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebApi JSON输出

WebApi JSON输出
EN

Stack Overflow用户
提问于 2012-11-20 13:54:06
回答 1查看 933关注 0票数 2

因此,我用MVC4创建了一个WebApi项目,但在理解JSON输出时遇到了问题。我不能完全确定这是JSON的预期输出,还是我做错了什么。

我有三个表(pb_Project、pb_Tasks和pb_Priority)。关系如下:项目可以有多个任务,每个项目可以有一个优先级。

entities http://img705.imageshack.us/img705/9294/stackoverflowentities.png

现在,我收到的输出很奇怪,也不是很直观。我不确定这是否是预期的JSON (因为我是一个全新的用户)。当我运行该网站来检索项目的JSON输出时,我得到了以下结果。

代码语言:javascript
复制
[

    {
        "$id": "1",
        "pb_Priority": {
            "$id": "2",
            "pb_Projects": [
                {
                    "$ref": "1"
                },
                {
                    "$id": "3",
                    "pb_Priority": {
                        "$ref": "2"
                    },
                    "pb_Tasks": [
                        {
                            "$id": "4",
                            "pb_Projects": {
                                "$ref": "3"
                            },
                            "TASK_ID": 3,
                            "PROJECT_ID": 2,
                            "USER_ID": 2,
                            "DUE_DATE": "2012-11-19T00:00:00",
                            "PRIORITY_ID": 2,
                            "TASK_NAME": "project 2 task 1",
                            "DESCRIPTION": "asdf"
                        }
                    ],
                    "PROJECT_ID": 2,
                    "USER_ID": 2,
                    "NAME": "Project2",
                    "DESCRIPTION": "project 2 description",
                    "BUDGET": 1,
                    "LOCATION": "CANADA",
                    "START_DATE": "2012-11-18T00:00:00",
                    "PRIORITY_ID": 1,
                    "PROJ_SCALE": null,
                    "NOTES": null
                }
            ],
            "PRIORITY_ID": 1,
            "PRIORITY_LEVEL": 1
        },
        "pb_Tasks": [
            {
                "$id": "5",
                "pb_Projects": {
                    "$ref": "1"
                },
                "TASK_ID": 1,
                "PROJECT_ID": 1,
                "USER_ID": 1,
                "DUE_DATE": "2012-11-19T00:00:00",
                "PRIORITY_ID": 1,
                "TASK_NAME": "project 1 task 1",
                "DESCRIPTION": "adsf"
            },
            {
                "$id": "6",
                "pb_Projects": {
                    "$ref": "1"
                },
                "TASK_ID": 2,
                "PROJECT_ID": 1,
                "USER_ID": 2,
                "DUE_DATE": "2012-11-19T00:00:00",
                "PRIORITY_ID": 1,
                "TASK_NAME": "project 1 task 2 user 2",
                "DESCRIPTION": "asd"
            }
        ],
        "PROJECT_ID": 1,
        "USER_ID": 1,
        "NAME": "Project1",
        "DESCRIPTION": "project 1 description",
        "BUDGET": 1000,
        "LOCATION": "USA",
        "START_DATE": "2012-11-18T00:00:00",
        "PRIORITY_ID": 1,
        "PROJ_SCALE": null,
        "NOTES": null
    },
    {
        "$ref": "3"
    }

]

其控制器如下所示:

代码语言:javascript
复制
public IEnumerable<pb_Projects> Getpb_Projects()
{
    return db.pb_Projects.AsEnumerable();
}

我期望从这个json结果中得到一个项目(对象)的列表,以及任何其他相关的FK等等。而在这里我得到了一个大对象,另一个ref是第二个对象。我是不是做错了什么,我希望会出现这样的情况(不要担心它只是测试数据,所以没有真正的密码:p)

代码语言:javascript
复制
[

{
    "$id": "1",
    "UserId": 1,
    "CreateDate": "2012-11-18T21:46:56.78",
    "ConfirmationToken": null,
    "IsConfirmed": true,
    "LastPasswordFailureDate": null,
    "PasswordFailuresSinceLastSuccess": 0,
    "Password": "AIGvGbJIedgTyY+m08DCVhZbVnRTWzW6kvl1JMOqsFqOCSjnJTBlGUGmVveAYIONJw==",
    "PasswordChangedDate": "2012-11-18T21:46:56.78",
    "PasswordSalt": "",
    "PasswordVerificationToken": null,
    "PasswordVerificationTokenExpirationDate": null
},
{
    "$id": "2",
    "UserId": 2,
    "CreateDate": "2012-11-18T21:48:05.067",
    "ConfirmationToken": null,
    "IsConfirmed": true,
    "LastPasswordFailureDate": null,
    "PasswordFailuresSinceLastSuccess": 0,
    "Password": "ACeoUpOVNEvgumvmSkFziRkNQzTlZC8+KAy32egXQseKLmhmJGX/VDXRXylkBUph3Q==",
    "PasswordChangedDate": "2012-11-18T21:48:05.067",
    "PasswordSalt": "",
    "PasswordVerificationToken": null,
    "PasswordVerificationTokenExpirationDate": null
},
{
    "$id": "3",
    "UserId": 3,
    "CreateDate": "2012-11-19T00:35:49.163",
    "ConfirmationToken": null,
    "IsConfirmed": true,
    "LastPasswordFailureDate": null,
    "PasswordFailuresSinceLastSuccess": 0,
    "Password": "AF7W+1FNLcaA2qJ3nmrB7S9mkJmJGZCpAZYbyH5+iXryq1epr8i67ddgSbvFQF1bQw==",
    "PasswordChangedDate": "2012-11-19T00:35:49.163",
    "PasswordSalt": "",
    "PasswordVerificationToken": null,
    "PasswordVerificationTokenExpirationDate": null
},
{
    "$id": "4",
    "UserId": 4,
    "CreateDate": "2012-11-19T00:39:00.667",
    "ConfirmationToken": null,
    "IsConfirmed": true,
    "LastPasswordFailureDate": null,
    "PasswordFailuresSinceLastSuccess": 0,
    "Password": "ABPdfSj8jZAWqhHMDuTVQuL3AiEmiplSujA/GNjQoGoMQm0zhNwAAOaInbqrXFrM0g==",
    "PasswordChangedDate": "2012-11-19T00:39:00.667",
    "PasswordSalt": "",
    "PasswordVerificationToken": null,
    "PasswordVerificationTokenExpirationDate": null
}

]

下面是未格式化的原始JSON

代码语言:javascript
复制
[{"$id":"1","pb_Priority":{"$id":"2","pb_Projects":[{"$ref":"1"},{"$id":"3","pb_Priority":{"$ref":"2"},"pb_Tasks":[],"PROJECT_ID":2,"USER_ID":2,"NAME":"test2","DESCRIPTION":"test2","BUDGET":1.0,"LOCATION":"test","START_DATE":"2012-11-18T00:00:00","PRIORITY_ID":1,"PROJ_SCALE":null,"NOTES":null}],"PRIORITY_ID":1,"PRIORITY_LEVEL":1},"pb_Tasks":[{"$id":"4","pb_Projects":{"$ref":"1"},"TASK_ID":1,"PROJECT_ID":1,"USER_ID":1,"DUE_DATE":"2012-11-19T00:00:00","PRIORITY_ID":1,"TASK_NAME":"asdf","DESCRIPTION":"adsf"},{"$id":"5","pb_Projects":{"$ref":"1"},"TASK_ID":2,"PROJECT_ID":1,"USER_ID":2,"DUE_DATE":"2012-11-19T00:00:00","PRIORITY_ID":1,"TASK_NAME":"sdf","DESCRIPTION":"asd"},{"$id":"6","pb_Projects":{"$ref":"1"},"TASK_ID":3,"PROJECT_ID":1,"USER_ID":2,"DUE_DATE":"2012-11-19T00:00:00","PRIORITY_ID":2,"TASK_NAME":"dsf","DESCRIPTION":"asdf"}],"PROJECT_ID":1,"USER_ID":1,"NAME":"test","DESCRIPTION":"test","BUDGET":null,"LOCATION":"test","START_DATE":"2012-11-18T00:00:00","PRIORITY_ID":1,"PROJ_SCALE":null,"NOTES":null},{"$ref":"3"}]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-20 14:57:24

如果你使用EF,默认情况下,它会延迟加载导航属性中的所有数据。当序列化程序序列化模型时,它将访问模型上的每个属性,EF将加载所有嵌套数据。

作为最佳实践,您不应该将您的DB模型公开为web api模型。您最好创建另一个DTO模型,该模型可以精确地控制将返回给客户端的内容以及您希望从客户端接收的内容。

或者,您可以通过修饰符隐藏这些导航属性(将它们标记为内部)或使用IgnoreDataMember属性来快速解决此问题。它告诉序列化程序在序列化和反序列化时不要访问它们。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13467339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档