简体   繁体   English

无法反序列化 JSON 数据

[英]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?有什么我想念的吗?

  1. To get players from the JSON response, you need jObj["response"]["players"] instead of jObj["players"] .要从 JSON 响应中获取players ,您需要jObj["response"]["players"]而不是jObj["players"]

  2. 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()获取数组的第一项。

  3. From the existing code, the userData is string type while persona is List<Models.SteamUser> type.从现有代码来看, userDatastring类型, personaList<Models.SteamUser>类型。 You can't assign userData to persona .您不能将userData分配给persona

  4. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM