如何将HttpClient异步结果传入void方法并解决FormatException异常
问题:调用PrintMembers方法抛出FormatException异常如何解决?
现有一段C#代码,通过HttpClient.GetFromJsonAsync获取JSON数据,在Main方法中直接遍历打印IList<User>对象可正常运行,但将结果传入void类型的PrintMembers方法时,抛出异常:
Unhandled exception. System.FormatException: Input string was not in a correct format. Failure to parse near offset 1. Expected an ASCII digit
需要取消注释PrintMembers方法并使其正常工作,原代码如下:
using System; using System.Net; using System.Net.Http; using System.Net.Http.Json; using System.Collections.Generic; using System.Threading.Tasks; public class User { public string name { get; set; } public string language { get; set; } public string id { get; set; } public string bio { get; set; } public double version { get; set; } public string FullName => $"{name} {id}"; } class Program { // ??? /* public static void PrintMembers(IList<User> ms) { foreach (var m in ms) { Console.WriteLine("{m.name} || {m.id}", m); } Console.WriteLine(); } */ static async Task Main (string[] args) { HttpClientHandler handler = new HttpClientHandler() { }; HttpClient s_client = new(handler) { }; var res= await s_client.GetFromJsonAsync<IList<User>>("https://www.fireboxtools.com/sample-data/json/64KB-min.json"); //PrintMembers(res); foreach (var item in res) { Console.WriteLine(item.name); } } }
解决方案
异常的核心原因是Console.WriteLine的语法错误:你混淆了字符串插值和复合格式化的用法。原代码中"{m.name} || {m.id}"这种写法,会被当成复合格式化的占位符解析,但m.name不是合法的数字占位符(比如{0}、{1}),所以触发FormatException。
修改PrintMembers方法,二选一即可:
方式1:使用字符串插值(推荐)
在字符串前添加$,直接在花括号内访问对象属性,无需额外传参数:
public static void PrintMembers(IList<User> ms) { foreach (var m in ms) { Console.WriteLine($"{m.name} || {m.id}"); } Console.WriteLine(); }
方式2:使用复合格式化
用数字占位符对应后面的参数:
public static void PrintMembers(IList<User> ms) { foreach (var m in ms) { Console.WriteLine("{0} || {1}", m.name, m.id); } Console.WriteLine(); }
修改后取消注释PrintMembers(res);,即可正常运行。
内容的提问来源于stack exchange,提问作者JeeyCi
相关产品推荐
相关产品推荐

