C#解析JSON时触发未处理异常:RuntimeBinderException求助
问题解决:JsonDocument.Parse参数类型不匹配报错
错误原因
你这里犯了重复处理的错误:
- 先用
JavaScriptSerializer.Deserialize()把下载的JSON字符串转换成了动态对象json_data - 接着又把这个已经反序列化的对象传给
JsonDocument.Parse(),但**JsonDocument.Parse()只接受原始JSON字符串、字节数组这类未解析的JSON数据**,不接受已反序列化的对象,因此触发类型不匹配异常。
两种修正方案
方案1:直接用System.Text.Json处理(推荐)
放弃JavaScriptSerializer,统一用System.Text.Json解析原始JSON字符串,代码更简洁规范:
private void Form1_Load(object sender, EventArgs e) { Label unit_used = label3; string QUERY_URL = "JSON URL HERE"; Uri queryUri = new Uri(QUERY_URL); using (System.Net.WebClient client = new System.Net.WebClient()) { // 获取原始JSON字符串 string rawJson = client.DownloadString(queryUri); // 用JsonDocument解析原始字符串,using声明自动释放资源 using var jsonDocument = JsonDocument.Parse(rawJson); var rootElement = jsonDocument.RootElement; var unit = rootElement.GetProperty("unit").GetString(); unit_used.Text = unit; } }
方案2:继续使用JavaScriptSerializer
既然已经完成反序列化,直接从动态对象中读取属性即可,无需再调用JsonDocument.Parse():
private void Form1_Load(object sender, EventArgs e) { Label unit_used = label3; string QUERY_URL = "JSON URL HERE"; Uri queryUri = new Uri(QUERY_URL); using (System.Net.WebClient client = new System.Net.WebClient()) { JavaScriptSerializer js = new JavaScriptSerializer(); dynamic json_data = js.Deserialize(client.DownloadString(queryUri), typeof(object)); // 直接从动态对象获取unit属性值 string unit = json_data["unit"]; unit_used.Text = unit; } }
额外建议:改用更现代的HttpClient
WebClient是旧版API,新项目建议用HttpClient,支持异步操作避免阻塞UI线程:
// 在Form类中声明静态HttpClient实例(全局复用) private static readonly HttpClient _httpClient = new HttpClient(); private async void Form1_Load(object sender, EventArgs e) { Label unit_used = label3; string QUERY_URL = "JSON URL HERE"; try { string rawJson = await _httpClient.GetStringAsync(QUERY_URL); using var jsonDocument = JsonDocument.Parse(rawJson); string unit = jsonDocument.RootElement.GetProperty("unit").GetString(); unit_used.Text = unit; } catch (Exception ex) { // 添加异常处理,比如提示用户加载失败 unit_used.Text = "加载失败"; } }
内容的提问来源于stack exchange,提问作者fsr_j
相关产品推荐
相关产品推荐

