I've been trying to write a script to reformat some large .json files, and had a functional prototype. However, when implementing functionality to parse the actions, reactions, legendary_actions, and special_abilities arrays, I got a System.ArgumentNullException: 'Value cannot be null. (Parameter 'method')' exception when trying to deserialize.
This is the deserialization method:
static List<MonsterOld> TestClassObject()
{
string fileName = @"S:\VTT SIM\VTTsim\Assets\Database json files\Monsters(SRD).json";
if (File.Exists(fileName))
{
var monsters = JsonConvert.DeserializeObject<List<MonsterOld>>(File.ReadAllText(fileName));
return monsters;
}
return (null);
}
An example .json item:
{
"slug": "scout",
"name": "Scout",
"size": "Medium",
"type": "humanoid",
"subtype": "any race",
"group": null,
"alignment": "any alignment",
"armor_class": 13,
"armor_desc": "leather armor",
"hit_points": 16,
"hit_dice": "3d8+3",
"speed": { "walk": 30 },
"strength": 11,
"dexterity": 14,
"constitution": 12,
"intelligence": 11,
"wisdom": 13,
"charisma": 11,
"strength_save": null,
"dexterity_save": null,
"constitution_save": null,
"intelligence_save": null,
"wisdom_save": null,
"charisma_save": null,
"perception": 5,
"skills": {
"nature": 4,
"perception": 5,
"stealth": 6,
"survival": 5
},
"damage_vulnerabilities": "",
"damage_resistances": "",
"damage_immunities": "",
"condition_immunities": "",
"senses": "passive Perception 15",
"languages": "any one language (usually Common)",
"challenge_rating": "1/2",
"cr": 0.5,
"actions": [
{
"name": "Multiattack",
"desc": "The scout makes two melee attacks or two ranged attacks."
},
{
"name": "Shortsword",
"desc": "Melee Weapon Attack: +4 to hit, reach 5 ft., one target. Hit: 5 (1d6 + 2) piercing damage.",
"attack_bonus": 4,
"damage_dice": "1d6",
"damage_bonus": 2
},
{
"name": "Longbow",
"desc": "Ranged Weapon Attack: +4 to hit, range 150/600 ft., one target. Hit: 6 (1d8 + 2) piercing damage.",
"attack_bonus": 4,
"damage_dice": "1d8",
"damage_bonus": 2
}
],
"reactions": "",
"legendary_desc": "",
"legendary_actions": "",
"special_abilities": [
{
"name": "Keen Hearing and Sight",
"desc": "The scout has advantage on Wisdom (Perception) checks that rely on hearing or sight."
}
],
}
And the class I'm trying to deserialize the problem arrays into:
public class MonsterOld
{
public string? name;
public string? size;
public string? type;
public string? subtype;
public string? alignment;
public int armor_class;
public string? armor_desc;
public int hit_points;
public string? hit_dice;
public Speed? speed;
public int? strength;
public int? dexterity;
public int? constitution;
public int? intelligence;
public int? wisdom;
public int? charisma;
public int? strength_save;
public int? dexterity_save;
public int? constitution_save;
public int? intelligence_save;
public int? wisdom_save;
public int? charisma_save;
public int? perception;
public Skills? skills;
public string? damage_vulnerabilities;
public string? damage_resistances;
public string? damage_immunities;
public string? condition_immunities;
public string? senses;
public string? languages;
public float cr;
public List<Action>? actions ;
public List<Action>? reactions ;
public string? legendary_desc;
public List<Action>? legendary_actions;
public List<Action>? special_abilities;
}
[Serializable]
public class Actions
{
public string? name;
public string? desc;
public string? damage_dice;
public int? attack_bonus;
public int? damage_bonus;
}
I'm still very new to C#, so simpler explanations or answers would be very much appreciated.