I am currently working on pulling data from the Bungie API Manifest. I successfully retrieve the .json file and i am the stage of trying to extract what i want from the file.
I'm trying to loop through all the entries in the JSON file and add to list where both activity.Key
& activity.displayProperties.name
exist as they do in the below example
"2693136600": {
"displayProperties": {
"description": "\"Grow fat from strength.\"",
"name": "Leviathan: Normal",
"icon": "/common/destiny2_content/icons/8b1bfd1c1ce1cab51d23c78235a6e067.png",
"hasIcon": true
},
Full Response for the above specific JSON Key:
"2693136600": {
"displayProperties": {
"description": "\"Grow fat from strength.\"",
"name": "Leviathan: Normal",
"icon": "/common/destiny2_content/icons/8b1bfd1c1ce1cab51d23c78235a6e067.png",
"hasIcon": true
},
"originalDisplayProperties": {
"description": "\"Grow fat from strength.\"",
"name": "Leviathan",
"icon": "/img/misc/missing_icon_d2.png",
"hasIcon": false
},
"selectionScreenDisplayProperties": {
"description": "Accept an invitation from the Cabal emperor to prove yourself aboard the Leviathan.\n\nRaids are 6 player cooperative activities which test the limits of your skill and teamwork. Master the unique mechanics of each encounter to succeed and earn powerful and exclusive rewards.",
"name": "Normal",
"hasIcon": false
},
"releaseIcon": "/img/misc/missing_icon_d2.png",
"releaseTime": 0,
"activityLevel": 30,
"completionUnlockHash": 0,
"activityLightLevel": 750,
"destinationHash": 3093898507,
"placeHash": 330251492,
"activityTypeHash": 2043403989,
"tier": 0,
"pgcrImage": "/img/destiny_content/pgcr/raid_gluttony.jpg",
"rewards": [
{
"rewardItems": [
{
"itemHash": 2127149322,
"quantity": 0
}
]
},
{
"rewardItems": [
{
"itemHash": 669267835,
"quantity": 0
}
]
}
],
"modifiers": [
{
"activityModifierHash": 2863316929
},
{
"activityModifierHash": 3296085675
},
{
"activityModifierHash": 871205855
},
{
"activityModifierHash": 2770077977
}
],
"isPlaylist": false,
"challenges": [],
"optionalUnlockStrings": [],
"inheritFromFreeRoam": false,
"suppressOtherRewards": false,
"playlistItems": [],
"matchmaking": {
"isMatchmade": false,
"minParty": 1,
"maxParty": 6,
"maxPlayers": 6,
"requiresGuardianOath": false
},
"directActivityModeHash": 2043403989,
"directActivityModeType": 4,
"activityModeHashes": [
2043403989,
1164760493
],
"activityModeTypes": [
4,
7
],
"isPvP": false,
"insertionPoints": [
{
"phaseHash": 2188993306,
"unlockHash": 0
},
{
"phaseHash": 1431486395,
"unlockHash": 0
},
{
"phaseHash": 3847906370,
"unlockHash": 0
},
{
"phaseHash": 4231923662,
"unlockHash": 0
}
],
"activityLocationMappings": [],
"hash": 2693136600,
"index": 559,
"redacted": false,
"blacklisted": false
},
My issue is that displayProperties
doesn't always contain name
so when ever this occurs the code fails.
I've tried various ways of doing this i can't get anything to work as they all it the catch
I am out of my depth with this one but it's almost the last piece in the puzzle for what i'm building so any help will be greatly appreciated.
Below is my latest failed attempt
HttpResponseMessage response = await client.GetAsync("https://bungie.net/common/destiny2_content/json/en/DestinyActivityDefinition-7ab91c74-e8a4-40c7-9f70-16a4354125c0.json");
if (response.IsSuccessStatusCode)
{
try
{
dynamic content = response.Content.ReadAsAsync<ExpandoObject>().Result;
foreach (dynamic activity in content)
{
//check if .name field exists under displayProperties
bool exist = activity.displayProperties.name;
if (exist == false)
{
//do nothing
}
else
{
//add both Key and displayProperties.name to list
bungieActivities.Add(new AllBungieActivities() { ActivityHash = activity.Key, ActivityDescription = activity.displayProperties.name });
}
}
}
catch
{
throw new ArgumentException("The member could not be found.");
}
}
Update I've not managed to implement any of the below answers and get it to work, i have however manager to get the below to work but takes quite a bit of time to pass this part
List<AllBungieActivities> bungieActivities = new List<AllBungieActivities>();
var response = await client.GetAsync("https://bungie.net/common/destiny2_content/json/en/DestinyActivityDefinition-7ab91c74-e8a4-40c7-9f70-16a4354125c0.json");
if (response.IsSuccessStatusCode)
{
try
{
var content = await response.Content.ReadAsStringAsync();
JObject activity = JObject.Parse(content);
foreach (JObject refId in activity.Properties().Select(p => p.Value["displayProperties"]))
{
if (refId.ContainsKey("name"))
{
bungieActivities.Add(new AllBungieActivities() { ActivityName = (string)refId["name"], ActivityHash = refId.Path.Substring(0, refId.Path.LastIndexOf(".") + 0) });
}
}
}
catch
{
throw new ArgumentException("The member could not be found.");
}
}
public class AllBungieActivities
{
public string ActivityName;
public string ActivityHash;
}