【问题标题】:Json deserialize dynamic does not work in .NET Core 3.1Json 反序列化动态在 .NET Core 3.1 中不起作用
【发布时间】:2020-03-06 20:04:43
【问题描述】:

动态对象的反序列化在 .NET Core 2.2 中运行良好,但在 .NET Core 3.1 中无法运行。

我正在使用Newtonsoft.Json nuget 包版本 v12.0.3。这是一个 ASP.NET Core MVC 项目。

public IActionResult Apply([FromBody]dynamic postData)
{
    string serverPath = _hostingEnvironment.WebRootPath;

    List<ModelData> list = new List<ModelData>();

    foreach (var item in JsonConvert.DeserializeObject(postData))
    {
        list.Add(new ModelData
            {
                Key = item.Key,
                Value = item.Value
            });
    }
}

我需要帮助来解决它

输入数据:

ValueKind = String : "[{'Key':'Table','Value':'admins'},{'Key':'MethodValue','Value':'Update'},{'Key':'Page','Value':'1'},{'Key':'Id','Value':'1'},{'Key':'ImgPath','Value':''},{'Key':'Id','Value':'1'},{'Key':'Login','Value':'admin'},{'Key':'Password','Value':'12345678999'}]"

这是我使用调试器看到的

模型数据输出

public struct ModelData
        {
            public string Key { get; set; }

            public string Value { get; set; }
        }

来自客户端页面的代码

function SendFormData(fileName) {
        var jsonArr = "[{'Key':'Table','Value':'@ViewBag.Table'},{'Key':'MethodValue','Value':'@ViewBag.MethodValue'}," +
            "{'Key':'Page','Value':'@ViewBag.Page'},{'Key':'Id','Value':'@ViewBag.Id'},";

        jsonArr += "{'Key':'ImgPath','Value':'" + fileName + "'},";

        var other_data = $("#ApplyForm").serializeArray();
        $.each(other_data, function (_key, input) {
            if (input.name === "Status") {
                return true;
            }
            jsonArr += "{'Key':'" + input.name + "','Value':'" + input.value + "'},";
        });

        jsonArr = jsonArr.slice(0, -1);
        jsonArr += "]";

        $.ajax({
            url: "/Admin/Apply",
            type: "POST",
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify(jsonArr),
            async: false,
            success: function (returnUrl) {
                AjaxLoad(returnUrl);
            },
            error: function () {
                console.log("@Translations.UpsErrorMessage");
            }
        });
    }

【问题讨论】:

  • 输入是什么?什么是预期的输出?实际输出是多少?
  • @OmairMajid ValueKind = String : "[{'Key':'Table','Value':'admins'},{'Key':'MethodValue','Value':'Update' },{'Key':'Page','Value':'1'},{'Key':'Id','Value':'1'},{'Key':'ImgPath','Value' :''},{'Key':'Id','Value':'1'},{'Key':'Login','Value':'admin'},{'Key':'Password', '值':'12345678999'}]"
  • 请同时添加ModelData
  • 您拥有的字符串不是 JSON。 JSON 对字段名称和字符串值使用双引号 ",而不是单引号 '
  • 您是否按照Where did IMvcBuilder AddJsonOptions go in .Net Core 3.0? 的说明将您的应用从system.text.json 切换回Json.NET?

标签: c# json asp.net-core-mvc json-deserialization


【解决方案1】:

看来客户端无法发送有效的postData(没有唯一性),并且不需要对任何字符串变量进行字符串化,除非它是一个数组,如下所示:

function SendFormData(fileName) {
    var jsonArr = [{'Key':'Table',''Value':'@ViewBag.Table'},
       {'Key':'MethodValue','Value':'@ViewBag.MethodValue'},
       {'Key':'Page','Value':'@ViewBag.Page'},
       {'Key':'ImgPath','Value':fileName}],
         other_data = $("#ApplyForm").serializeArray();

    $.each(other_data, function (_key, input) {
        if (input.name === "Status") {
            return true;
        }
        jsonArr.push({Key: input.name, Value: input.value});
    });

    $.ajax({
        url: "/Admin/Apply",
        type: "POST",
        contentType: 'application/json; charset=utf-8',
        data: {postData:JSON.stringify(jsonArr)},
        async: false,
        success: function (returnUrl) {
            AjaxLoad(returnUrl);
        },
        error: function () {
            console.log("@Translations.UpsErrorMessage");
        }
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2018-04-02
    • 2021-10-22
    • 2018-06-13
    • 2018-11-09
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多