Почему десериализация возвращает ноль?C#

Место общения программистов C#
Ответить
Anonymous
 Почему десериализация возвращает ноль?

Сообщение Anonymous »

Я пытаюсь десериализовать ответ SteamAPI в C# .NET 7. Я делаю запрос REST через RestSharp и сохраняю содержимое в виде файла.
Позже я загружаю файл и хотите десериализовать его для поиска с помощью LINQ. Но с различными опциями JsonSerializerOptions это не работает. SteamAppList.AppList всегда имеет значение null.
Для модели данных я использовал Json2Csharp и Jetbrains Rider.
Я пробовал разные JsonSerializerOptions< /code> и выполнил отладку с помощью VS Code и Jetbrains Rider.
Вот моя модель (SteamAppList.cs):
[Serializable]
public class SteamAppList
{
[JsonPropertyName("applist")]
public Applist Applist;
}

[Serializable]
public class Applist
{
[JsonPropertyName("apps")]
public List Apps;
}

[Serializable]
public class App
{
[JsonPropertyName("appid")]
public int Appid;

[JsonPropertyName("name")]
public string Name;
}

И мой SteamApps.cs для запроса и десериализации:
public class SteamApps
{
private readonly CancellationToken cancellationToken;

private async Task GetSteamApps()
{
var client = new RestClient();
var request = new RestRequest("https://api.steampowered.com/ISteamApps/GetAppList/v2/");
request.AddHeader("Accept", "*/*");
request.AddHeader("User-Agent", "Major GSM");
var response = await client.GetAsync(request, cancellationToken);
return response;
}

public bool RetireveAndSaveSteamApps()
{
var path = FileModule.GetDirectoryPath(MajorGsmLibrary.ApplicationDirectory.Games);
var fileName = "steam.library.json";
RestResponse restResponse = GetSteamApps().Result;

try
{
File.WriteAllText(Path.Combine(path, fileName), restResponse.Content);
}
catch (IOException exception)
{
LogModule.WriteError("Could not write steam library file!", exception);
return false;
}
catch (ArgumentNullException exception)
{
LogModule.WriteError("Missing data for steam library file", exception);
return false;
}
return true;
}

public static string CheckGameAgainstSteamLibraryWithAppId(string appId)
{
var path = FileModule.GetDirectoryPath(MajorGsmLibrary.ApplicationDirectory.Games);
var fileName = "steam.library.json";
var fileData =
File.ReadAllText(Path.Combine(path, fileName));
SteamAppList? steamAppList = JsonSerializer.Deserialize(fileData, new JsonSerializerOptions { MaxDepth = 64, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping });

if (steamAppList!.Applist != null)
{
var app = steamAppList.Applist.Apps.SingleOrDefault(x => x.Appid.ToString() == appId);
if (app != null) return app.Name;
}

return "Unknown";
}
}

Я вызываю класс SteamApps из приложения GTK#:
foreach (var game in Games)
{
var appName = SteamApps.CheckGameAgainstSteamLibraryWithAppId(game.AppId);

if (appName == "Unknown")
return;

game.FoundInSteamLibrary = true;
game.SteamLibraryName = appName;
}

Получаемый мной JSON выглядит следующим образом:
{
"applist": {
"apps": [
{
"appid": 1941401,
"name": ""
},
{
"appid": 1897482,
"name": ""
},
{
"appid": 2112761,
"name": ""
},
{
"appid": 1470110,
"name": "Who's Your Daddy Playtest"
},
{
"appid": 2340170,
"name": "Melon Knight"
},
{
"appid": 1793090,
"name": "Blockbuster Inc."
}
]
}
}


Подробнее здесь: https://stackoverflow.com/questions/764 ... eturn-null
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»