C# 在.Net Core 3.1中将http响应转换为json格式
我有一个返回http响应的函数,我想将此返回转换为json格式,以便能够在特定模型中检索和分配一些值。 我使用NetCore3.1 以下是我想制作的模型:C# 在.Net Core 3.1中将http响应转换为json格式,c#,asp.net,asp.net-core,json.net,csom,C#,Asp.net,Asp.net Core,Json.net,Csom,我有一个返回http响应的函数,我想将此返回转换为json格式,以便能够在特定模型中检索和分配一些值。 我使用NetCore3.1 以下是我想制作的模型: public class UserSharePointViewModel { public string DisplayName { get; set; } public string AccountName { get; set; } public string Email { get; set; } pub
public class UserSharePointViewModel
{
public string DisplayName { get; set; }
public string AccountName { get; set; }
public string Email { get; set; }
public string Picture { get; set; }
}
这是我的功能:
public async Task<UserSharePointViewModel> GetUserProfilInfoFromSharePoint()
{
string accessToken = await GetAccessToken();
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri(_configuration["SharePointConfiguration:WebSiteUrl"]);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var response = await httpClient.GetAsync("_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v='i:0%23.f|membership|mellafi@naxxum.fr'");
var finalData = await response.Content.ReadAsStringAsync();
var _dataResponse = JToken.Parse(JsonConvert.SerializeObject(finalData));
UserSharePointViewModel userResult = new UserSharePointViewModel()
{
AccountName = _dataResponse["AccountName"].ToString(),
Email = _dataResponse["Email"].ToString(),
DisplayName = _dataResponse["PersonalUrl"].ToString(),
Picture = _dataResponse["PictureUrl"].ToString()
};
return userResult;
}
}
公共异步任务GetUserProfilInfoFromSharePoint()
{
字符串accessToken=等待GetAccessToken();
使用(var httpClient=new httpClient())
{
httpClient.BaseAddress=新Uri(_配置[“SharePointConfiguration:WebSiteUrl]”);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“application/x-www-form-urlencoded”);
httpClient.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,accessToken);
var response=wait httpClient.GetAsync(“\u api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v='i:0%23.f |成员资格|mellafi@naxxum.fr'");
var finalData=wait response.Content.ReadAsStringAsync();
var_dataResponse=JToken.Parse(JsonConvert.SerializeObject(finalData));
UserSharePointViewModel userResult=新的UserSharePointViewModel()
{
AccountName=\u dataResponse[“AccountName”]。ToString(),
Email=\u dataResponse[“Email”].ToString(),
DisplayName=\u dataResponse[“PersonalUrl”]。ToString(),
Picture=\u dataResponse[“PictureUrl”].ToString()
};
返回用户结果;
}
}
此函数返回以下错误:
您可以执行以下操作:
private static readonly HttpClient httpcLient = new HttpClient();
public async Task<UserSharePointViewModel> GetUserProfilInfoFromSharePoint()
{
string accessToken = await GetAccessToken();
httpClient.BaseAddress = new Uri(_configuration["SharePointConfiguration:WebSiteUrl"]);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var response = await httpClient.GetAsync("url");
var finalData = await response.Content.ReadAsStringAsync();
var _dataResponse = JsonConvert.DeserializeObject<UserSharePointViewModel>(finalData));
UserSharePointViewModel userResult = new UserSharePointViewModel()
{
AccountName = _dataResponse.AccountName,
Email = _dataResponse.Email,
DisplayName = _dataResponse.PersonalUrl,
Picture = _dataResponse.PictureUrl
};
return userResult;
}
private static readonly HttpClient HttpClient=new HttpClient();
公共异步任务GetUserProfilInfoFromSharePoint()
{
字符串accessToken=等待GetAccessToken();
httpClient.BaseAddress=新Uri(_配置[“SharePointConfiguration:WebSiteUrl]”);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“application/x-www-form-urlencoded”);
httpClient.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,accessToken);
var response=wait httpClient.GetAsync(“url”);
var finalData=wait response.Content.ReadAsStringAsync();
var_dataResponse=JsonConvert.DeserializeObject(finalData));
UserSharePointViewModel userResult=新的UserSharePointViewModel()
{
AccountName=\u dataResponse.AccountName,
Email=\u dataResponse.Email,
DisplayName=\u dataResponse.PersonalUrl,
Picture=\u dataResponse.PictureUrl
};
返回用户结果;
}
顺便说一句,您不应该像使用HTTP一样使用它,HttpClient应该是静态的并且可以重复使用,您不应该对HttpClient使用“using”。
查看此链接以了解更多信息:首先将“finalData”反序列化为其对应的对象(UserSharePointResponse),然后转换为UserSharePointViewModel将是一件轻而易举的事情。我还将任务
更改为任务
(但不是必需的)
public async Task/*Task*/getuserprofilinfofromfromsharepoint()
{
字符串accessToken=等待GetAccessToken();
使用(var httpClient=new httpClient())
{
httpClient.BaseAddress=新Uri(_配置[“SharePointConfiguration:WebSiteUrl]”);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“application/x-www-form-urlencoded”);
httpClient.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,accessToken);
var response=wait httpClient.GetAsync(“\u api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v='i:0%23.f |成员资格|mellafi@naxxum.fr'");
var finalData=wait response.Content.ReadAsStringAsync();
//var_dataResponse=JToken.Parse(JsonConvert.SerializeObject(finalData));
var\u dataResponse=JsonConvert.DeserializeObject(finalData);
UserSharePointViewModel userResult=新的UserSharePointViewModel()
{
AccountName=\u dataResponse.AccountName,
Email=\u dataResponse.Email,
DisplayName=\u dataResponse.PersonalUrl,
Picture=\u dataResponse.PictureUrl
};
//返回用户结果;
返回Json(userResult,JsonRequestBehavior.AllowGet);
}
}
公共类UserSharePointResponse
{
公共字符串PersonalUrl{get;set;}
公共字符串AccountName{get;set;}
公共字符串电子邮件{get;set;}
公共字符串PictureUrl{get;set;}
}
您是否尝试过JsonConvert.DeserializeObject(finalData)代码>?可能propname不匹配,但您可以对Json-Attributes进行Delfine;如何访问AccountName之类的特定参数?Izzy是对的,您应该反序列化整个内容,而不是使用JToken。还要执行Console.WriteLine(finalData)
以查看响应并确保它是正确的json.json是字符串。响应已经是一个字符串。最多,JsonConvert.SerializeObject(finalData)
将在响应周围添加一对额外的引号,JToken.Parse
将返回一个值仅为原始字符串的实体。您不会将字符串转换为JSON,而是使用JsonConvert.DeserializeObject
将JSON字符串转换为对象,谢谢!但是我的http响应不会返回UserSharePointViewModel类型的对象。我想从这个响应中得到一些字段的值,并将它们分配到UserSharePointViewModel DTO中。您能提供一个从服务器得到的响应的示例吗?
public async Task<JsonResult> /*Task<UserSharePointViewModel>*/ GetUserProfilInfoFromSharePoint()
{
string accessToken = await GetAccessToken();
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri(_configuration["SharePointConfiguration:WebSiteUrl"]);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var response = await httpClient.GetAsync("_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v='i:0%23.f|membership|mellafi@naxxum.fr'");
var finalData = await response.Content.ReadAsStringAsync();
//var _dataResponse = JToken.Parse(JsonConvert.SerializeObject(finalData));
var _dataResponse = JsonConvert.DeserializeObject<UserSharePointResponse>(finalData);
UserSharePointViewModel userResult = new UserSharePointViewModel()
{
AccountName = _dataResponse.AccountName,
Email = _dataResponse.Email,
DisplayName = _dataResponse.PersonalUrl,
Picture = _dataResponse.PictureUrl
};
//return userResult;
return Json(userResult, JsonRequestBehavior.AllowGet);
}
}
public class UserSharePointResponse
{
public string PersonalUrl { get; set; }
public string AccountName { get; set; }
public string Email { get; set; }
public string PictureUrl { get; set; }
}