响应内容不是补水对象
Response Content not Hydrating Object
我在 MVC 核心应用程序的控制器中调用 API,如下所示:
HttpContent httpContent = new StringContent(string.Empty, Encoding.UTF8, "text/plain");
HttpResponseMessage response = await client.PostAsync("api/users", httpContent);
if (response.IsSuccessStatusCode) {
User userJson = await response.Content.ReadFromJsonAsync<User>();
string responseContent = await response.Content.ReadAsStringAsync();
responseContent 的值为:
"{
\"actionName\":\"GetUser\",
\"routeValues\":{\"id\":\"30131055-9ff0-472f-a147-69e76f7aac77\"},
\"value\":{\"uid\":\"a36065bd-9d88-4ea3-f04d-08d98cfa8b83\",
\"email\":\"example@example.org\",
\"active\":true,\"created\":\"2021-10-12T19:49:16.0054897Z\",
\"updated\":\"2021-10-12T19:49:16.0054899Z\"},\"formatters\":[],
\"contentTypes\":[],
\"statusCode\":201
}"
我没想到会出现这种类型的格式化内容,我期待的是 JSON,但我可以在“值”部分看到我的用户对象的值。
我的 uid、email、active、created 和 updated 的 User 对象属性都是 public 个具有 get/set 方法的属性。
所以我可以看到我的数据在那里,但是当我尝试反序列化对用户对象的响应时,我只看到实例化后的默认值。
我觉得我缺少一些简单的东西。
您的用户 class 似乎与响应 json 不匹配,您可以像这样创建与响应匹配的 class 结构
public class RouteValues
{
public string id { get; set; }
}
public class Value //your user class
{
public string uid { get; set; }
public string email { get; set; }
public bool active { get; set; }
public DateTime created { get; set; }
public DateTime updated { get; set; }
}
public class Response
{
public string actionName { get; set; }
public RouteValues routeValues { get; set; }
public Value value { get; set; }
public List<object> formatters { get; set; }
public List<object> contentTypes { get; set; }
public int statusCode { get; set; }
}
并反序列化到响应 class 并访问与您的用户对象等效的值对象,或者通过指定包含您的用户对象的键(即值键)来反序列化。
Christian Franco noticed that the items in the object being return matched CreatedAtActionResult 我调用的 API 返回的是我预期的值。这解释了我看到的奇怪行为。
我在 MVC 核心应用程序的控制器中调用 API,如下所示:
HttpContent httpContent = new StringContent(string.Empty, Encoding.UTF8, "text/plain");
HttpResponseMessage response = await client.PostAsync("api/users", httpContent);
if (response.IsSuccessStatusCode) {
User userJson = await response.Content.ReadFromJsonAsync<User>();
string responseContent = await response.Content.ReadAsStringAsync();
responseContent 的值为:
"{
\"actionName\":\"GetUser\",
\"routeValues\":{\"id\":\"30131055-9ff0-472f-a147-69e76f7aac77\"},
\"value\":{\"uid\":\"a36065bd-9d88-4ea3-f04d-08d98cfa8b83\",
\"email\":\"example@example.org\",
\"active\":true,\"created\":\"2021-10-12T19:49:16.0054897Z\",
\"updated\":\"2021-10-12T19:49:16.0054899Z\"},\"formatters\":[],
\"contentTypes\":[],
\"statusCode\":201
}"
我没想到会出现这种类型的格式化内容,我期待的是 JSON,但我可以在“值”部分看到我的用户对象的值。
我的 uid、email、active、created 和 updated 的 User 对象属性都是 public 个具有 get/set 方法的属性。
所以我可以看到我的数据在那里,但是当我尝试反序列化对用户对象的响应时,我只看到实例化后的默认值。
我觉得我缺少一些简单的东西。
您的用户 class 似乎与响应 json 不匹配,您可以像这样创建与响应匹配的 class 结构
public class RouteValues
{
public string id { get; set; }
}
public class Value //your user class
{
public string uid { get; set; }
public string email { get; set; }
public bool active { get; set; }
public DateTime created { get; set; }
public DateTime updated { get; set; }
}
public class Response
{
public string actionName { get; set; }
public RouteValues routeValues { get; set; }
public Value value { get; set; }
public List<object> formatters { get; set; }
public List<object> contentTypes { get; set; }
public int statusCode { get; set; }
}
并反序列化到响应 class 并访问与您的用户对象等效的值对象,或者通过指定包含您的用户对象的键(即值键)来反序列化。
Christian Franco noticed that the items in the object being return matched CreatedAtActionResult 我调用的 API 返回的是我预期的值。这解释了我看到的奇怪行为。