尝试在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中。那么我该如何修改它以便当我的朋友调用这个方法时,它会返回会话数据?
答案 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字符串都会使用引号进行转义。作为流返回不那么痛苦,因为在使用它之前你不必去除字符串。