如何返回JSON数据?已装Newtonsoft,如何将字符串对象转为JSON
嘿,我来帮你搞定这两个WebService的JSON相关需求,结合你给出的代码,给你具体的实现方案:
1. 让WebService正确返回JSON数据
你已经给InsertData方法加了[ScriptMethod(ResponseFormat = ResponseFormat.Json)]属性,这步是对的,但现在返回的是拼接的字符串,没法被识别为结构化的JSON。我们需要返回一个自定义的结果对象,再通过Newtonsoft.Json把它序列化成标准JSON。
2. 用Newtonsoft.Json将数据对象转成JSON
首先,我们先定义两个辅助类,用来封装返回的结果和学生数据(这样返回的JSON结构清晰,前端好解析):
// 封装返回的整体结果 public class InsertResult { public bool Success { get; set; } public string Message { get; set; } public StudentInfo InsertedStudent { get; set; } } // 封装插入的学生信息 public class StudentInfo { public string FirstName { get; set; } public string MiddleName { get; set; } public string LastName { get; set; } public string Email { get; set; } // 你可以根据需求添加其他字段,比如联系方式、地址等 }
接下来修改你的InsertData方法,优化数据库操作的资源管理(用using自动释放连接,避免泄漏),同时用Newtonsoft.Json完成序列化:
using Newtonsoft.Json; using System.Data.SqlClient; using System.Web.Services; using System.Web.Script.Services; public class WebService1 : System.Web.Services.WebService { [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public string InsertData(string fname, string mname, string lname, string emailid, string password, string contactno, string hobby, string address, string countrycodenum) { // 初始化返回结果对象 var result = new InsertResult(); string connStr = ConfigurationManager.ConnectionStrings["cnn"].ConnectionString; // 使用using语句自动管理数据库连接和命令的生命周期 using (SqlConnection cn = new SqlConnection(connStr)) { try { cn.Open(); string insertQuery = @"INSERT INTO tblstudent(fname, mname, lname, emailid, password, contactno, hobby, address, countrycodenum) VALUES(@fname, @mname, @lname, @emailid, @password, @contactno, @hobby, @address, @countrycodenum)"; using (SqlCommand cmd = new SqlCommand(insertQuery, cn)) { // 添加参数,避免SQL注入 cmd.Parameters.AddWithValue("@fname", fname); cmd.Parameters.AddWithValue("@mname", mname); cmd.Parameters.AddWithValue("@lname", lname); cmd.Parameters.AddWithValue("@emailid", emailid); cmd.Parameters.AddWithValue("@password", password); cmd.Parameters.AddWithValue("@contactno", contactno); cmd.Parameters.AddWithValue("@hobby", hobby); cmd.Parameters.AddWithValue("@address", address); cmd.Parameters.AddWithValue("@countrycodenum", countrycodenum); int rowsAffected = cmd.ExecuteNonQuery(); if (rowsAffected > 0) { result.Success = true; result.Message = "数据插入成功"; // 把插入的学生信息封装进去 result.InsertedStudent = new StudentInfo { FirstName = fname, MiddleName = mname, LastName = lname, Email = emailid }; } else { result.Success = false; result.Message = "数据插入失败"; } } } catch (Exception ex) { // 捕获异常,返回错误信息 result.Success = false; result.Message = $"插入过程出错:{ex.Message}"; } } // 用Newtonsoft.Json把结果对象序列化成JSON字符串返回 return JsonConvert.SerializeObject(result); } }
几个关键要点说明:
- 结构化返回:通过自定义类,返回的JSON会有清晰的结构(比如
{"Success":true,"Message":"数据插入成功","InsertedStudent":{"FirstName":"xxx"...}}),前端可以直接解析这些字段,比拼接的字符串好用多了。 - 资源安全:
using语句会在代码块结束后自动关闭并释放数据库连接和命令,比手动调用cn.Close()更可靠,不会因为异常导致连接泄漏。 - 异常处理:加了
try-catch块,能捕获数据库操作中的错误,把错误信息返回给调用方,方便调试和处理异常场景。 - 避免SQL注入:你原来用参数化查询的做法是对的,要保持这个好习惯,别直接拼接SQL语句。
这样修改后,你的WebService就能正确返回标准的JSON数据,同时也完成了把学生数据对象转成JSON的需求。
内容的提问来源于stack exchange,提问作者Raju
相关产品推荐
相关产品推荐

