You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Newtonsoft.Json反序列化含CSV URL的JSON响应报错,求正确方法

解决JSON反序列化的类型转换错误

你遇到的问题核心是JSON结构和反序列化目标类型不匹配,咱们一步步拆解问题并给出解决方案:

你的现有代码与问题

收到的JSON响应

{ "url": "https://XXX/plugins/servlet/export/exportAttachment?fileName=Cycle-SPRINT+19.csv" }

自定义的实体类

public class csvBody { 
    public string url { get; set; } 
}

反序列化代码

WebResponse response = (HttpWebResponse) request.GetResponse(); 
Stream newStream = response.GetResponseStream(); 
StreamReader sr = new StreamReader(newStream); 
String resJson = sr.ReadToEnd(); 
var dict = JsonConvert.DeserializeObject<Dictionary<string, csvBody>>(resJson);

触发的错误

Newtonsoft.Json.JsonSerializationException: 'Error converting value "https://xxx/plugins/servlet/export/exportAttachment?fileName=Cycle-SPRINT+19.csv" to type 'ReadCSV.csvBody'. Path 'url', line 1, position 101.'

问题原因

你的JSON中,url字段的值是一个普通字符串,但你试图将它反序列化为Dictionary<string, csvBody>——这个类型意味着你期望url对应的值是一个csvBody对象,而非字符串,类型不匹配自然会抛出序列化错误。

正确的反序列化方法

推荐两种适配JSON结构的方案:

方案一:直接反序列化为csvBody类(推荐)

你的JSON根结构完全匹配csvBody类的定义,直接反序列化到该类即可:

WebResponse response = (HttpWebResponse) request.GetResponse(); 
Stream newStream = response.GetResponseStream(); 
StreamReader sr = new StreamReader(newStream); 
String resJson = sr.ReadToEnd(); 
// 直接反序列化为csvBody对象
var csvData = JsonConvert.DeserializeObject<csvBody>(resJson);
// 后续可通过csvData.url获取目标链接

方案二:用字典接收(仅适用于特殊场景)

如果确实需要用字典存储,需调整字典的泛型类型,因为url的值是字符串,所以字典类型应为Dictionary<string, string>:

var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(resJson);
// 后续通过dict["url"]获取目标链接

显然方案一更贴合你定义csvBody类的初衷,也更符合面向对象的编码思路。

内容的提问来源于stack exchange,提问作者mach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:09:32