问题描述
我正在尝试将来自特定模型的 HTTP 响应的 JSON 文本反序列化。但它失败并出现以下异常:
Message=将值 "{"Id":"1","UserName":"RK"}" 转换为类型 'ConsoleApp5.TestData' 时出错。
内部异常 1:ArgumentException:无法从 System.String 到 ConsoleApp5.TestData。
代码如下:
static async Task Main()
{
var jsonText =
"{\n \"args\": {},\n \"data\": \"{\\\"Id\\\":\\\"1\\\",\\\"UserName\\\":\\\"RK\\\"}\",\n \"files\": {},\n \"form\": {},\n \"headers\": {\n \"Accept\": \"application/json\",\n \"Content-Length\": \"26\",\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"Host\": \"httpbin.org\",\n \"X-Amzn-Trace-Id\": \"Root=1-60c3783a-1f273fd11e5828436035ac22\"\n },\n \"json\": {\n \"Id\": \"1\",\n \"UserName\": \"RK\"\n },\n \"method\": \"POST\",\n \"origin\": \"223.184.90.85\",\n \"url\": \"https://httpbin.org/anything\"\n}\n";
var output = JsonConvert.DeserializeObject<JsonResponseStruct>(jsonText);
}
public class JsonResponseStruct
{
public TestData Data;
}
public class TestData
{
public string Id;
public string UserName;
}
JSON:
{
"args": {},"data": "{\"Id\":\"1\",\"UserName\":\"RK\"}","files": {},"form": {},"headers": {
"Accept": "application/json","Content-Length": "26","Content-Type": "application/json; charset=utf-8","Host": "httpbin.org","X-Amzn-Trace-Id": "Root=1-60c3783a-1f273fd11e5828436035ac22"
},"json": {
"Id": "1","UserName": "RK"
},"method": "POST","origin": "223.184.90.85","url": "https://httpbin.org/anything"
}
解决方法
我认为问题出在 JSON 上。如果你仔细观察JSON。您会发现 data
值位于倒逗号的 "{\"Id\":\"1\",\"UserName\":\"RK\"}"
中,这意味着它会将其视为字符串。
因此,如果您将数据类型指定为字符串,它将起作用。或者你需要做一些解决方法来获取它作为对象。
public class JsonResponseStruct
{
public string Data;
}