C#将返回数据解析为JSON

时间:2014-09-22 09:11:06

标签: c# sql json serialization boolean

尝试在C#中将返回数据解析为JSON时遇到了一些问题。所以基本上我有一个在SELECT SQL语句中的例子:

[WebMethod]
public string getUserDetails(string userID)
{
    DataTable dt = new DataTable();
    SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnStr"].ConnectionString);
    string select = "select * from dbo.User WHERE userID = '" + userID + "'";
    sqlConnection.Open();
    SqlDataAdapter da = new SqlDataAdapter(select, sqlConnection);
    da.Fill(dt);
    System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
    Dictionary<string, object> row;
    foreach (DataRow dr in dt.Rows)
    {
        row = new Dictionary<string, object>();
        foreach (DataColumn col in dt.Columns)
        {
            row.Add(col.ColumnName, dr[col]);
        }
        rows.Add(row);
    }
    sqlConnection.Close();
    return serializer.Serialize(rows);
}

这些代码正常运行。但是当谈到INSERT SQL语句时,我不知道如何将返回的布尔值传递给JSON:

[WebMethod]
public bool addUser(UserModel um)
{
    bool result = false;
    result = Conversion.intToBool(SplashAwardsDB.executeNonQuery(
            "INSERT INTO dbo.User ("
            + "userName, password, firstName, lastName, address, contactNo, birthDate, familyID, familyRole, x, y ) "
            + " VALUES ("
            + "'" + um.userName + "', "
            + "'" + um.password + "', "
            + "'" + um.firstName + "', "
            + "'" + um.lastName + "', "
            + "'" + um.address + "', "
            + "'" + um.contactNo + "', "
            + "'" + um.birthDate + "', "
            + "'" + um.familyID + "', "
            + "'" + um.familyRole + "', "
            + "'" + um.x + "', "
            + "'" + um.y + "')"
            ));
        return result;
    }

有关如何序列化的任何指南?

修改

[WebMethod]
public string checkLoginCredential(string userName, string password)
{
    bool result = false;
    using (var connection = new SqlConnection(SplashAwardsDB.connectionString))
    {
        SqlCommand command = new SqlCommand("SELECT userName, password FROM dbo.User WHERE userName = '" + userName + "' AND password = '" + password + "'", connection);
        connection.Open();
        using (var dr = command.ExecuteReader())
        {
            if (dr.Read())
            {
                Session["userName"] = dr["userName"];
                result = true;
            }
        }
    }            
    return serializer.Serialize(result);
}

基本上我正在尝试检查登录凭据。如果用户名和密码匹配,我会将userName存储到sesssion中。那么我该如何修改它以便当我的朋友调用这个方法时,它会返回会话数据?

1 个答案:

答案 0 :(得分:0)

除了SQL注入之外,请尝试使用Newtonsoft JSON库(也称为JSON.Net) - 可从Visual Studio中的Nuget Package Manager获得。你的JSON不能只返回布尔值,否则它不是JSON。您的布尔值是一个值,它是根据字段名称存储的。所以例如你会回复:

{
  result:true
}

最简单的方法是使用以下代码,它创建一个匿名对象,然后将其序列化为JSON字符串:

var res = new
{
    result = myResult
};
var x = JsonConvert.SerializeObject(res);
return x;

在这种情况下,myResult是一个布尔变量,用于存储您想要返回的值。这可以缩短为:

return JsonConvert.SerializeObject(new { result = myResult });

这将返回一个JSON字符串,但是如果您从Web服务GET请求返回,您可能还需要考虑使用正确的mime类型返回返回类型Stream,如下所示: / p>

WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";
var ms = new MemoryStream();
var sw = new StreamWriter(ms, Encoding.UTF8);
sw.Write(JsonConvert.SerializeObject(new { result = myResult }));
sw.Flush();
ms.Position = 0;
return ms;

后一种方法的一个好处是JSON字符串不会被引号括起来,当你返回一个字符串时就是这样。对于您的示例而言,这不是什么大问题,但任何具有字符串属性的JSON字符串都会使用引号进行转义。作为流返回不那么痛苦,因为在使用它之前你不必去除字符串。