2014-09-22 78 views
2

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

[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语句,我不知道如何返回boolean值传递到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); 
} 

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

+3

在你走之前,请请Google谷歌“SQL注入” – RobH 2014-09-22 09:16:37

+0

好吧,但我该怎么做,因为我试过这个:System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization .JavaScriptSerializer(); return serializer.Serialize(result);但它会抛出一条错误消息,它不能隐式地将字符串转换为bool – 2014-09-22 09:17:47

+1

那是因为'addUser'的返回类型是bool,而您试图返回一个字符串... – RobH 2014-09-22 09:30:38

回答

1

不考虑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请求返回时,你可能还需要考虑返回的Stream返回类型与不是正确的MIME类型,像这样:

后一种方法的
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字符串都会引用引号。作为一个流返回不是一件痛苦的事情,因为在使用它之前你不必使用字符串。