在c#控制器中读取JSON对象/数组

本文关键字:对象 数组 JSON 读取 控制器 | 更新日期: 2023-09-27 18:12:22

首先,我为任何错误的术语提前道歉!我读了很多关于如何做到这一点的博客和文章,我已经失明了,但却陷入了僵局。

我已经成功地通过AJAX将参数传递给控制器中的MVC操作,该操作以JSON格式返回SQL数据表供我在页面中使用。我发送的一组参数示例如下:

var parameters = {
    pSQL: "SELECT * FROM v_MyTable",
    pSQLServer: "SERVER01",
};

我的客户端脚本是这样的;

$.ajax({
    type: 'POST',
    url: '/ControllerName/GiveMeJSON',
    data: JSON.stringify(parameters),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    ...
});

我的控制器动作简单地像这样工作;

    public string GiveMeJSON(string pSQL, string pSQLServer)
    {
        var SQL = pSQL
        var SQLSERVER = pSQLServer
        // do stuff and return JSON
    }

这对我来说一直很有效。我发送JSON请求数据作为POST和接收JSON数据作为回报。辉煌。

现在,我想扩展我的动作的功能,这样我就可以传递一个额外的变量集作为一个数组,就像这样;

var parameters = {
    pSQL: "SELECT * FROM v_MyTable",
    pSQLServer: "SERVER01",
    pMoreParams: {
        pParameter1: "ABC",
        pParameter2: "XYZ",
    }
};

…其中MoreParams中的参数名可以被称为任何类型的值。这很重要,因为我认为这就排除了使用模型的可能性。

这导致POST请求的BODY看起来像这样:

{"pSQL":"SELECT * FROM v_MyTable","pSQLSERVER":"SERVER01","pMoreParams":{"pParameter1":"ABC","pParameter2":"XYZ"}}

所以我需要的数据显然是去服务器,但我真的很难枚举/访问这些额外的项目在pMoreParams数组。我似乎离目标越来越近了,我试过使用……

public string GiveMeJSON(string pSQL, string pSQLServer, List<string> pMoreParams)

…和我有一个foreach循环在控制器运行然而许多项目都在pMoreParams列表(2,在上面的例子中),但只是似乎无法弄清楚如何访问/读取这些值在该列表中的控制器动作。

我现在不知道如何循环并读取我发送的额外数据。我感觉我很接近,使用List<string>IEnumerable -但解决方案回避了我。

当我将它们作为一个简单的有效JSON字符串发送时,我有更多的成功让控制器读取这些额外的参数,像这样;

var parameters = {
    pSQL: "SELECT * FROM v_MyTable",
    pSQLServer: "SERVER01",
    pMoreParams: '[{"name": "pParameter1", "value": "ABC" },{"name": "pParameter2", "value": "XYZ"}]'
};

…使用控制器动作看起来像这样;

    public class SQLParam
    {
        public string name { get; set; }
        public string value { get; set; }
    }

    if (string.IsNullOrEmpty(pMoreParams) == false)
    {
        var sqlparameters = JsonConvert.DeserializeObject<SQLParam[]>(pMoreParams);
        foreach (var sqlparameter in sqlparameters)
        {
            Debug.WriteLine(sqlparameter.name, sqlparameter.value);
        }
    };

…但是我失去了在客户端jquery/javascript中轻松读取和修改这些值的能力,我更喜欢/希望保持我定义参数的方式,这样我就可以使用一行代码轻松读取和修改值,比如;

parameters.pMoreParams[0].pParameter1 = "NEW VALUE";

…因为我可以简单地再次触发AJAX调用,并使用新的参数值进行post。

任何帮助和建议都是非常感激的,谢谢!

在c#控制器中读取JSON对象/数组

何时发送:

"pMoreParams":{"pParameter1":"ABC","pParameter2":"XYZ"}

你正在发送一个名为pMoreParams的对象,它有两个属性。

如果你想从控制器获得这些,你需要创建一个c#对象来镜像你正在发送的JSON。

public class MoreParams
{
    public string pParameter1 {get;set;}
    public string pParameter2 {get;set;}
}

然后更新你的动作方法:

public string GiveMeJSON(string pSQL, string pSQLServer, MoreParams pMoreParams)
{
    var param1 = pMoreParams.pParameter1;
    var param2 = pMoreParams.pParameter2;
}

边注

您正在发送供服务器执行的SQL。我知道这很方便,但这是一个巨大的安全问题,将导致SQL注入,这将允许攻击者控制你的SQL服务器。

好的,睡个好觉后,我想我已经提出了一个解决方案,满足我的要求,不必在一个类中定义所有可能的和未来的参数,也满足了一些SQL注入问题,已经阅读了使用参数化;

这是数据I JSON。字符串化并通过AJAX传递给控制器;

var chart01Params = {
pSQLCon: "ConnectionString",
pSQL: "MySQLFile.sql", // accessible only by the server from MapPath
pMoreParams : 
    [
        {
            "name" : "pParameterXYZ",
            "value": "12345ABC"
        },
    ],
};

{"pSQLCon":"ConnectionString","pSQL":"MySQLFile.sql","pMoreParams":[{"name":"pParameterXYZ","value":"12345ABC"}]}

这是我的类;

public class SQLParam
{
    public string name { get; set; }
    public string value { get; set; }
}

这是我的控制器头;

public string GETMYJSON(string pSQLCon, string pSQL, List<SQLParam> pMoreParams)

…在我的控制器执行SQL命令之前,它会向SQL查询添加任何参数和值,我希望这将使它更安全,免受SQL注入攻击;

foreach (SQLParam parameter in pMoreParams)
{
    cmd.Parameters.Add(parameter.name, SqlDbType.Char);
    cmd.Parameters[parameter.name].Value = parameter.value;
}

效果很好!如果我想发送查询所需的参数,我可以这样做,而不必将它们包含在类中,而且我还可以使用本地客户端脚本从DOM中获取选择/输入并设置参数值,只要我知道我想要更改的参数值的对象中的索引。