无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 'portal.Models.SubProjectViewRecord'
Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'portal.Models.SubProjectViewRecord'
我有这个简单的代码,它将使用 url.
中的 api json 数组
public ActionResult ViewRecord()
{
ViewBag.Title = "- Geotagging Sub Project Record.";
var webClient = new WebClient();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12;
webClient.Headers.Add(HttpRequestHeader.Cookie, "cookievalue");
string objJson = webClient.DownloadString(@"https://test.com/api/lib_region");
//here we will map the Json to C# class
Models.SubProjectViewRecord oop = JsonConvert.DeserializeObject<Models.SubProjectViewRecord>(objJson);
return View(oop);
}
我的模型
namespace portal.Models
{
public class SubProjectViewRecord
{
public string Name { get; set; }
public int Id { get; set; }
}
}
上面代码的错误是:
'Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'portal.Models.SubProjectViewRecord' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path '', line 1, position 1.'
然后这些是我应用到模型的修复,因为一些回复正在发布。
public class SubProjectViewRecord
{
public List<string> Name { get; set; }
public List<int> Id { get; set; }
}
到这一行:
Models.SubProjectViewRecord oop = JsonConvert.DeserializeObject<List<Models.SubProjectViewRecord>>(objJson);
但出现错误:
Cannot implicitly convert type 'System.Collections.Generic.List<portal.Models.SubProjectViewRecord>' to 'portal.Models.SubProjectViewRecord'
提前致谢。
从错误看来,数组中有多个项目,这就是 api 响应返回任何数组的原因。你可以为它使用 List<T>
,它的代码就像:
List<Models.SubProjectViewRecord> oop = JsonConvert.DeserializeObject<List<Models.SubProjectViewRecord>>(objJson);
虽然假设 json 数组元素是 json 对象,Id
和 Name
里面的成员:
public class SubProjectViewRecord
{
public string Name { get; set; }
public int Id { get; set; }
}
首先,您需要知道 JSON 是如何返回数据的。所以,如果你有这样的事情:
[
{
"name": "",
"id": ""
}
]
您需要的是 class 的列表,它实现了类似的结构(例如 SubProjectViewRecord)。所以,你会有这样的东西:
List<SubProjectViewRecord> oop = JsonConvert.DeserializeObject<List<SubProjectViewRecord>>(objJson);
如果您看到了,那正是您的错误所说的。它说:“我无法将列表分配给 SubProjectViewRecord 变量”。
所以,请确保:
- 您的 class 与您的 JSON 结构完全匹配。
- 您为反序列化提供的 class(您在 DeserializeObject 上传递的泛型)与将接收反序列化的变量相同。
我有这个简单的代码,它将使用 url.
中的 api json 数组public ActionResult ViewRecord()
{
ViewBag.Title = "- Geotagging Sub Project Record.";
var webClient = new WebClient();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12;
webClient.Headers.Add(HttpRequestHeader.Cookie, "cookievalue");
string objJson = webClient.DownloadString(@"https://test.com/api/lib_region");
//here we will map the Json to C# class
Models.SubProjectViewRecord oop = JsonConvert.DeserializeObject<Models.SubProjectViewRecord>(objJson);
return View(oop);
}
我的模型
namespace portal.Models
{
public class SubProjectViewRecord
{
public string Name { get; set; }
public int Id { get; set; }
}
}
上面代码的错误是:
'Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'portal.Models.SubProjectViewRecord' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path '', line 1, position 1.'
然后这些是我应用到模型的修复,因为一些回复正在发布。
public class SubProjectViewRecord
{
public List<string> Name { get; set; }
public List<int> Id { get; set; }
}
到这一行:
Models.SubProjectViewRecord oop = JsonConvert.DeserializeObject<List<Models.SubProjectViewRecord>>(objJson);
但出现错误:
Cannot implicitly convert type 'System.Collections.Generic.List<portal.Models.SubProjectViewRecord>' to 'portal.Models.SubProjectViewRecord'
提前致谢。
从错误看来,数组中有多个项目,这就是 api 响应返回任何数组的原因。你可以为它使用 List<T>
,它的代码就像:
List<Models.SubProjectViewRecord> oop = JsonConvert.DeserializeObject<List<Models.SubProjectViewRecord>>(objJson);
虽然假设 json 数组元素是 json 对象,Id
和 Name
里面的成员:
public class SubProjectViewRecord
{
public string Name { get; set; }
public int Id { get; set; }
}
首先,您需要知道 JSON 是如何返回数据的。所以,如果你有这样的事情:
[
{
"name": "",
"id": ""
}
]
您需要的是 class 的列表,它实现了类似的结构(例如 SubProjectViewRecord)。所以,你会有这样的东西:
List<SubProjectViewRecord> oop = JsonConvert.DeserializeObject<List<SubProjectViewRecord>>(objJson);
如果您看到了,那正是您的错误所说的。它说:“我无法将列表分配给 SubProjectViewRecord 变量”。
所以,请确保:
- 您的 class 与您的 JSON 结构完全匹配。
- 您为反序列化提供的 class(您在 DeserializeObject 上传递的泛型)与将接收反序列化的变量相同。