2014-09-22 79 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字符串都會引用引號。作爲一個流返回不是一件痛苦的事情,因爲在使用它之前你不必使用字符串。