环境:VS 2017 Entity Framework 6.0
文章参考
https://dzone.com/articles/a-few-great-ways-to-consume-restful-apis-in-c
问题: 如何将Web Api 2通话转换为我的实体?
人员实体
public partial class Person
{
public int id { get; set; }
public string name { get; set; }
}
...
Web API 2控制器
namespace WebApplication2.Controllers
{
public class PeopleController : ApiController
{
private testdbEntities db = new testdbEntities();
// GET: api/People
public IQueryable<Person> GetPeople()
{
return db.People;
}
...
无法使最后一行正常工作
var client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
var response = client.DownloadString("http://localhost:49777/api/People");
var releases = JArray.Parse(response); //This works
Person p = JsonConvert.DeserializeObject<Person>(response); //How do I get this to work?
...
错误:
Newtonsoft.Json.JsonSerializationException HResult = 0x80131500
Message =无法将当前JSON数组(例如[1,2,3])反序列化为 键入“ WebApplication1.Person”,因为该类型需要JSON对象 (例如{“ name”:“ value”})正确反序列化。解决此错误 将JSON更改为JSON对象(例如{“ name”:“ value”})或 将反序列化类型更改为数组或实现 集合接口(例如ICollection,IList),例如List 从JSON数组反序列化。 JsonArrayAttribute也可以是 添加到类型以强制其从JSON数组反序列化。路径 '',第1行,位置1。Source = Newtonsoft.Json StackTrace:在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(JsonReader 阅读器,键入objectType,JsonContract合同)
答案 0 :(得分:1)
执行此操作。
var client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
var response = client.DownloadString("http://localhost:49777/api/People");
var releases = JArray.Parse(response); //This works
var people = JsonConvert.DeserializeObject<Person[]>(response);
已更改
Person p = JsonConvert.DeserializeObject<Person>(response);
对此。
var people = JsonConvert.DeserializeObject<Person[]>(response);
在您所涉及的文章链接中,他们使用的端点返回版本列表。这就是他们首先将其解析为Json Array的原因。
根据您从端点返回的内容,您的代码将更改。但是由于您说过JArray.Parse(
行正在成功执行,所以我认为您的端点也正在返回人员列表。因此,您需要将其反序列化为people
列表而不是单个people
对象。