繁体   English   中英

使用 fetch 发布多个对象后反序列化 JsonElement

[英]Deserialize JsonElement after posting multiple objects using fetch

我正在尝试使用 fetch 将多个对象发布到.core 3.1 API。 我已经设法将结果作为 JsonElement 接收,但我无法对其进行反序列化。

JS 数据和获取:

       const users = [
            {
                ID: 1,
                Firstname: "MyFirstname",
                Lastname: "MyLastname"
            },
            {
                ID: 2,
                Firstname: "Jeff",
                Lastname: "Troll"
            }
        ];

        const company = {
            ID: 1,
            Companyname: "Stackoverflow",
            Location: "Unknown"
        };

        await fetch(URL, {
            method: "POST",
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
            users: users,
            company:company
           })
        })
            .then(response => {
                response.text().then(function (text) {
                    alert(text);
                });
            });

该帖子通过了我的操作,我可以看到 JSON 结果,但我无法对其进行反序列化。

我的行动:

        [HttpPost]
        public async Task<ActionResult<Users>> Post([FromBody]JsonElement data)
        {
            try
            {
                var users = JsonSerializer.Deserialize<Users>(data.GetRawText());
                var company = JsonSerializer.Deserialize<Company>(data.GetRawText());
                ...
            }
        }

在我尝试反序列化它们后,用户和公司属性为空。 不知道我做错了什么,以及如何在不为此创建特定 Model 的情况下进行简单的反序列化(我不希望这样做,因为这是我只使用一次的帖子。

JsonElement 数据如下所示:

ValueKind = Object : "
{"users":[{"ID":1,"Firstname":"MyFirstname","Lastname":"MyLastname"},
{"ID":2,"Firstname":"Jeff","Lastname":"Troll"}],
"company":
{"ID":1,"Companyname":"Stackoverflow","Location":"Unknown"}}
"

JsonElement 是正确的选择吗? 或者我可以通过其他方式解决它吗?

@arkhz 要回答您的问题,请在实施或解决方案下方找到。

    public class Users
    {
        public int ID { get; set; }
        public string Firstname { get; set; }
        public string Lastname { get; set; }
    }

    public class Company
    {
        public int ID { get; set; }
        public string Companyname { get; set; }
        public string Location { get; set; }
    }

        [HttpPost]
        public async Task<ActionResult<Users>> Post([FromBody]JsonElement data)
        {
            try
            {
                var users = JsonSerializer.Deserialize<List<Users>>(data.GetRawText());
                var company = JsonSerializer.Deserialize<Company>(data.GetRawText());
                return Ok(new { message = "", data = users });
            }
            catch
            {
                return Ok(new { message = "", data = data });
            }
        }

所以特别是您的 json object 用户和公司是用户列表 Object 或用户集合 ZA8CFDE63931BD59EB26AC9C64。

在下面找到作为测试发送的示例 JsonString

{
    "users": [
        {
            "ID": 1,
            "Firstname": "MyFirstname",
            "Lastname": "MyLastname"
        },
        {
            "ID": 2,
            "Firstname": "Jeff",
            "Lastname": "Troll"
        }
    ],
    "company": {
        "ID": 1,
        "Companyname": "Stackoverflow",
        "Location": "Unknown"
    }
}

请你也可以像这样创造你的身体。

var body = {"users": users, "company":company};

 await fetch(URL, {
            method: "POST",
            headers: {
                'Content-Type': 'application/json'
            },
            body:body
        })
            .then(response => {
                response.text().then(function (text) {
                    alert(text);
                });
            });

请这个工作,我已经测试了一遍。 我可以分享你测试过的 postman 的截图。 用 vscode。

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM