【问题标题】:Deserialize JsonElement after posting multiple objects using fetch使用 fetch 发布多个对象后反序列化 JsonElement
【发布时间】:2020-06-25 08:41:49
【问题描述】:

我正在尝试使用 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());
                ...
            }
        }

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

JsonElement 数据如下所示:

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

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

【问题讨论】:

  • 创建一个class 来表示您的有效负载(使用UsersCompany 属性)并用它替换JsonElement
  • 您能否分享一个示例 json 主体以提供解决方案或指针?
  • @haim770 感谢您的回复。是的,如果没有其他方法可以解决这个问题,我可能会为此使用类/模型。
  • @AKINNUBIABIOLASYLVESTER ABIOLA SYLVESTER - 我更新了问题,添加了用户和公司元素以及 jsonelement 响应。
  • 我认为反序列化一个对输入建模一次的类比将数据反序列化两次到不同的类更简单。另请注意:data 不是UserCompany,而是其他东西,所以这不起作用。

标签: javascript c# .net-core


【解决方案1】:

@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 对象是用户对象列表或用户对象集合。

在下面找到作为测试发送的示例 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);
                });
            });

拜托这行得通,我已经测试了一遍。我可以分享你测试邮递员的截图。使用 vscode。

谢谢

【讨论】:

  • 刚刚尝试过,但似乎没有用。每当它到达用户列表的反序列化时 - 就会发生异常:{"The JSON value could not be converted to System.Collections.Generic.List`1[Users]. Path: $ | LineNumber: 0 | BytePositionInLine: 1."}。公司财产全部变为空。认为我需要以其他方式处理“System.Text.Json.JsonElement”。或者如果不可能,就使用模型。
  • 请使用我粘贴在答案中的示例 JSON 进行测试。 JSON stringify 方法在您的对象周围放置了一个引号,因此我建议您以另一种方式创建您的 json。否则它应该工作
猜你喜欢
  • 2013-05-01
  • 2016-04-30
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多