[英]Unable to deserialize the JSON Data
I'm currently using an API to grab some player information, which looks like this in raw data form:我目前正在使用 API 来获取一些玩家信息,原始数据形式如下所示:
{
"response": {
"players": [
{
"steamid": "76561198166559342",
"communityvisibilitystate": 1,
"profilestate": 1,
"personaname": "Stack Overflow",
"commentpermission": 2,
"profileurl": "https://steamcommunity.com/id/stackoverflow/",
"avatar": "https://avatars.akamai.steamstatic.com/8a2e52a3eaefed0296459fa811aasdasd1ce29374.jpg",
"avatarmedium": "https://avatars.akamai.steamstatic.com/8a2e52a3eaefed0296459fa81asdas1ce29374_medium.jpg",
"avatarfull": "https://avatars.akamai.steamstatic.com/8a2e52a3eaefed0296459fa811a61212312e29374_full.jpg",
"avatarhash": "8a2e52a3eaefed02asdasd",
"personastate": 0
}
]
}
}
I am trying to just grab the "personaname" and "avatar" values from my data, which have been quite unsuccessful, so I've tried to objectify the JSON before getting it, which still isn't working:我试图从我的数据中获取“personaname”和“avatar”值,但非常不成功,所以我尝试在获取它之前将 JSON 对象化,但仍然无法正常工作:
Models.SteamUser persona;
String httpres;
using (var client = new HttpClient())
{
string steamurl = "MY HIDDEN URL HERE" + s64;
var steamapi = new Uri(steamurl);
var result = client.GetAsync(steamapi).Result.Content.ReadAsStringAsync().Result;
var json = result.ToString();
httpres = json;
var jUser = JObject.Parse(json);
var userData = JsonConvert.DeserializeObject<Models.SteamUser>(jUser["players"]).ToString(); ;
persona = userData;
}
Is there something I'm missing?有什么我想念的吗?
To get players
from the JSON response, you need jObj["response"]["players"]
instead of jObj["players"]
.要从 JSON 响应中获取
players
,您需要jObj["response"]["players"]
而不是jObj["players"]
。
You have to deserialize as List<Models.SteamUser>
but not Models.SteamUser
as it is an array.您必须反序列化为
List<Models.SteamUser>
而不是Models.SteamUser
,因为它是一个数组。 Then with IEnumerable.FirstOrDefault()
to get the first item of the array.然后使用
IEnumerable.FirstOrDefault()
获取数组的第一项。
From the existing code, the userData
is string
type while persona
is List<Models.SteamUser>
type.从现有代码来看,
userData
是string
类型, persona
是List<Models.SteamUser>
类型。 You can't assign userData
to persona
.您不能将
userData
分配给persona
。
Not suggested using Task.Result
as it performs the operation synchronously and waits for the operation to be completed.不建议使用
Task.Result
,因为它会同步执行操作并等待操作完成。 Hence, it may lead to a deadlock.因此,它可能会导致死锁。 Instead, works with
async
/ await
.相反,使用
async
/ await
。 Source: What happens while waiting on a Task's Result?资料来源: 等待任务结果时会发生什么?
Your code should be looked as below:您的代码应如下所示:
Models.SteamUser persona = null;
using (var client = new HttpClient())
{
string steamurl = "MY HIDDEN URL HERE" + s64;
var steamapi = new Uri(steamurl);
var response = await client.GetAsync(steamapi);
var jsonResult = await response.Content.ReadAsStringAsync();
var jObj = JObject.Parse(jsonResult);
var players = JsonConvert.DeserializeObject<List<Models.SteamUser>>(jObj["response"]["players"].ToString());
// Or
// var players = (jObj["response"]["players"] as JArray).ToObject<List<Models.SteamUser>>();
persona = players.FirstOrDefault();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.