.NET MAUI中JSON反序列化报错问题求助
问题分析与解决
核心错误原因
你的REST API返回的是JSON数组([{"empname":"JHON DOE"}]),但你在C#代码里尝试把它反序列化成单个EmployeeModel对象,类型完全不匹配,这就是反序列化抛出错误的直接原因。
修复方案
方案1:调整C#代码适配数组返回
把反序列化的目标类型改成数组或列表,再取其中的元素:
async Task LoadEmployee() { try { string url = "http://192.168.103.11/employee_detail.php"; HttpClient client = new HttpClient(); HttpResponseMessage response = await client.GetAsync(url); // 替换.Result为await,避免阻塞线程 if (response.IsSuccessStatusCode) { string result = await response.Content.ReadAsStringAsync(); // 反序列化为EmployeeModel列表 var empList = JsonConvert.DeserializeObject<List<EmployeeModel>>(result); // 因为你的查询只返回一条数据,直接取第一个元素 if (empList.Count > 0) { Console.WriteLine(empList[0].empname); // 修正变量引用错误 } } } catch (Exception ex) { Console.WriteLine(ex.Message); } }
方案2:修改PHP API返回单个对象
如果你的业务逻辑确保这个查询只会返回一条数据,可以直接修改PHP代码,返回单个JSON对象而非数组:
<?php require_once('koneksi.php'); if ($result = mysqli_query($conn, "SELECT empname FROM master_karyawan WHERE emp_id='M0000'")) { $row = $result->fetch_array(MYSQLI_ASSOC); mysqli_close($conn); echo json_encode($row); // 直接输出单个对象,不再用数组包裹 }
这样你原来的C#反序列化代码(JsonConvert.DeserializeObject<EmployeeModel>(result))就能正常工作,记得把Console.WriteLine(empname)改成Console.WriteLine(emp.empname)即可。
额外优化建议
- 复用HttpClient:不要每次请求都创建新的
HttpClient实例,推荐定义静态单例,避免频繁创建销毁导致的socket资源耗尽问题。 - 避免同步阻塞:原代码里的
client.GetAsync(url).Result会阻塞线程,换成await更符合异步编程规范。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

