Skip to content

Commit 24c3051

Browse files
Make PMP JSON reading robust against most null or missing fields.
1 parent 15d272e commit 24c3051

File tree

2 files changed

+32
-23
lines changed

2 files changed

+32
-23
lines changed

xivModdingFramework/Mods/FileTypes/PMP.cs

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,19 @@ await IOUtil.UnzipFiles(path, tempFolder, (file) =>
116116
var metaPath = Path.Combine(path, "meta.json");
117117

118118
var text = File.ReadAllText(metaPath);
119-
var meta = JsonConvert.DeserializeObject<PMPMetaJson>(text);
119+
var meta = JsonConvert.DeserializeObject<PMPMetaJson>(text, new JsonSerializerSettings
120+
{
121+
NullValueHandling = NullValueHandling.Ignore
122+
});
120123

121124
string image = null;
122125

123126

124127

125-
var defaultOption = JsonConvert.DeserializeObject<PMPOptionJson>(File.ReadAllText(defModPath));
128+
var defaultOption = JsonConvert.DeserializeObject<PMPOptionJson>(File.ReadAllText(defModPath), new JsonSerializerSettings
129+
{
130+
NullValueHandling = NullValueHandling.Ignore
131+
});
126132

127133
var groups = new List<PMPGroupJson>();
128134

@@ -132,7 +138,10 @@ await IOUtil.UnzipFiles(path, tempFolder, (file) =>
132138
{
133139
if (Path.GetFileName(file).StartsWith("group_") && Path.GetFileName(file).ToLower().EndsWith(".json"))
134140
{
135-
var group = JsonConvert.DeserializeObject<PMPGroupJson>(File.ReadAllText(file));
141+
var group = JsonConvert.DeserializeObject<PMPGroupJson>(File.ReadAllText(file), new JsonSerializerSettings
142+
{
143+
NullValueHandling = NullValueHandling.Ignore
144+
});
136145
if (group != null)
137146
{
138147
groups.Add(group);
@@ -1300,12 +1309,12 @@ public string GetHeaderImage()
13001309
public class PMPMetaJson
13011310
{
13021311
public int FileVersion;
1303-
public string Name;
1304-
public string Author;
1305-
public string Description;
1306-
public string Version;
1307-
public string Website;
1308-
public string Image;
1312+
public string Name = "";
1313+
public string Author = "";
1314+
public string Description = "";
1315+
public string Version = "";
1316+
public string Website = "";
1317+
public string Image = "";
13091318

13101319
// These exist.
13111320
public List<string> ModTags;
@@ -1315,14 +1324,14 @@ public class PMPMetaJson
13151324
[JsonSubtypes.KnownSubType(typeof(PMPImcGroupJson), "Imc")]
13161325
public class PMPGroupJson
13171326
{
1318-
public string Name;
1319-
public string Description;
1327+
public string Name = "";
1328+
public string Description = "";
13201329
public int Priority;
1321-
public string Image;
1330+
public string Image = "";
13221331
public int Page;
13231332

13241333
// "Multi", "Single", or "Imc"
1325-
public string Type;
1334+
public string Type = "";
13261335

13271336
// Only used internally when the user is selecting options during install/application.
13281337
[JsonIgnore] public int SelectedSettings = -1;
@@ -1335,8 +1344,8 @@ public class PMPGroupJson
13351344

13361345
public class PMPImcGroupJson : PMPGroupJson
13371346
{
1338-
public PMPImcManipulationJson.PMPImcEntry DefaultEntry;
13391347
public PmpIdentifierJson Identifier;
1348+
public PMPImcManipulationJson.PMPImcEntry DefaultEntry;
13401349
public bool AllVariants;
13411350
public bool OnlyAttributes;
13421351

@@ -1387,22 +1396,22 @@ public static PmpIdentifierJson FromRoot(XivDependencyRootInfo root, int variant
13871396
}
13881397

13891398
[JsonConverter(typeof(JsonSubtypes))]
1390-
[JsonSubtypes.KnownSubTypeWithProperty(typeof(PmpStandardOptionJson), "Files")]
1399+
[JsonSubtypes.FallBackSubType(typeof(PmpStandardOptionJson))]
13911400
[JsonSubtypes.KnownSubTypeWithProperty(typeof(PmpDisableImcOptionJson), "IsDisableSubMod")]
13921401
[JsonSubtypes.KnownSubTypeWithProperty(typeof(PmpImcOptionJson), "AttributeMask")]
13931402
public class PMPOptionJson
13941403
{
1395-
public string Name;
1396-
public string Description;
1397-
public string Image;
1404+
public string Name = "";
1405+
public string Description = "";
1406+
public string Image = "";
13981407
}
13991408

14001409
public class PmpStandardOptionJson : PMPOptionJson
14011410
{
1402-
public Dictionary<string, string> Files;
1403-
public Dictionary<string, string> FileSwaps;
1404-
public List<PMPManipulationWrapperJson> Manipulations;
1405-
public int Priority;
1411+
public int Priority = 0;
1412+
public Dictionary<string, string> Files = new();
1413+
public Dictionary<string, string> FileSwaps = new();
1414+
public List<PMPManipulationWrapperJson> Manipulations = new();
14061415

14071416
[JsonIgnore] public bool IsEmptyOption => !(
14081417
(FileSwaps != null && FileSwaps.Count > 0) ||

xivModdingFramework/Mods/FileTypes/PmpManipulation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,10 +345,10 @@ public static PMPImcEntry FromXivImc(XivImc imc)
345345
}
346346
}
347347
public PMPImcEntry Entry;
348+
public PMPObjectType ObjectType;
348349
public uint PrimaryId;
349350
public uint SecondaryId;
350351
public uint Variant;
351-
public PMPObjectType ObjectType;
352352
public PMPEquipSlot EquipSlot;
353353
public PMPObjectType BodySlot;
354354

0 commit comments

Comments
 (0)