diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs
index 9165d948..89d8822f 100644
--- a/SabreTools.Library/DatFiles/Json.cs
+++ b/SabreTools.Library/DatFiles/Json.cs
@@ -71,7 +71,7 @@ namespace SabreTools.Library.DatFiles
// Machine array
case "machines":
- ReadMachines(sr, jtr, filename, indexId);
+ ReadMachines(jtr, filename, indexId);
jtr.Read();
break;
@@ -109,12 +109,10 @@ namespace SabreTools.Library.DatFiles
///
/// Read machine array information
///
- /// StreamReader to use to parse the header
/// JsonTextReader to use to parse the machine
/// Name of the file to be parsed
/// Index ID for the DAT
private void ReadMachines(
- StreamReader sr,
JsonTextReader jtr,
// Standard Dat parsing
@@ -125,92 +123,57 @@ namespace SabreTools.Library.DatFiles
if (jtr == null)
return;
+ // Read in the machine array
jtr.Read();
- while (!sr.EndOfStream)
+ JsonSerializer js = new JsonSerializer();
+ JArray machineArray = js.Deserialize(jtr);
+
+ // Loop through each machine object and process
+ foreach (JObject machineObj in machineArray)
{
- // If we hit the end of an array, we want to return
- if (jtr.TokenType == JsonToken.EndArray)
- return;
-
- // We don't care about anything except start object
- if (jtr.TokenType != JsonToken.StartObject)
- {
- jtr.Read();
- continue;
- }
-
- ReadMachine(sr, jtr, filename, indexId);
- jtr.Read();
+ ReadMachine(machineObj, filename, indexId);
}
}
///
/// Read machine object information
///
- /// StreamReader to use to parse the header
- /// JsonTextReader to use to parse the machine
+ /// JObject representing a single machine
/// Name of the file to be parsed
/// Index ID for the DAT
private void ReadMachine(
- StreamReader sr,
- JsonTextReader jtr,
+ JObject machineObj,
// Standard Dat parsing
string filename,
int indexId)
{
- // If we have an empty machine, skip it
- if (jtr == null)
+ // If object is invalid, skip it
+ if (machineObj == null)
return;
// Prepare internal variables
JsonSerializer js = new JsonSerializer();
Machine machine = null;
- jtr.Read();
- while (!sr.EndOfStream)
- {
- // If we hit the end of the machine, return
- if (jtr.TokenType == JsonToken.EndObject)
- return;
+ // Read the machine info, if possible
+ if (machineObj.ContainsKey("machine"))
+ machine = machineObj["machine"].ToObject();
- // We don't care about anything except properties
- if (jtr.TokenType != JsonToken.PropertyName)
- {
- jtr.Read();
- continue;
- }
-
- switch (jtr.Value)
- {
- case "machine":
- jtr.Read();
- machine = js.Deserialize(jtr);
- break;
-
- case "items":
- ReadItems(sr, jtr, filename, indexId, machine);
- break;
-
- default:
- break;
- }
-
- jtr.Read();
- }
+ // Read items, if possible
+ if (machineObj.ContainsKey("items"))
+ ReadItems(machineObj["items"] as JArray, filename, indexId, machine);
}
///
/// Read item array information
///
- /// StreamReader to use to parse the header
- /// JsonTextReader to use to parse the machine
+ /// JArray representing the items list
/// Name of the file to be parsed
/// Index ID for the DAT
/// Machine information to add to the parsed items
private void ReadItems(
- StreamReader sr,
- JsonTextReader jtr,
+ JArray itemsArr,
// Standard Dat parsing
string filename,
@@ -219,40 +182,26 @@ namespace SabreTools.Library.DatFiles
// Miscellaneous
Machine machine)
{
- // If the reader is invalid, skip
- if (jtr == null)
+ // If the array is invalid, skip
+ if (itemsArr == null)
return;
- jtr.Read();
- while (!sr.EndOfStream)
+ // Loop through each datitem object and process
+ foreach (JObject itemObj in itemsArr)
{
- // If we hit the end of an array, we want to return
- if (jtr.TokenType == JsonToken.EndArray)
- return;
-
- // We don't care about anything except start object
- if (jtr.TokenType != JsonToken.StartObject)
- {
- jtr.Read();
- continue;
- }
-
- ReadItem(sr, jtr, filename, indexId, machine);
- jtr.Read();
+ ReadItem(itemObj, filename, indexId, machine);
}
}
///
/// Read item information
///
- /// StreamReader to use to parse the header
- /// JsonTextReader to use to parse the machine
+ /// JObject representing a single datitem
/// Name of the file to be parsed
/// Index ID for the DAT
/// Machine information to add to the parsed items
private void ReadItem(
- StreamReader sr,
- JsonTextReader jtr,
+ JObject itemObj,
// Standard Dat parsing
string filename,
@@ -261,75 +210,49 @@ namespace SabreTools.Library.DatFiles
// Miscellaneous
Machine machine)
{
- // If we have an empty machine, skip it
- if (jtr == null)
+ // If we have an empty item, skip it
+ if (itemObj == null)
return;
// Prepare internal variables
- JsonSerializer js = new JsonSerializer();
DatItem datItem = null;
- jtr.Read();
- while (!sr.EndOfStream)
+ // Read the datitem info, if possible
+ if (itemObj.ContainsKey("datitem"))
{
- // If we hit the end of the machine - create, add, and return
- if (jtr.TokenType == JsonToken.EndObject)
+ JToken datItemObj = itemObj["datitem"];
+ switch (datItemObj.Value("type").AsItemType())
{
- // If we didn't read something valid, just return
- if (datItem == null)
- return;
-
- datItem.CopyMachineInformation(machine);
- datItem.Source = new Source { Index = indexId, Name = filename };
- ParseAddHelper(datItem);
-
- return;
- }
-
- // We don't care about anything except properties
- if (jtr.TokenType != JsonToken.PropertyName)
- {
- jtr.Read();
- continue;
- }
-
- switch (jtr.Value)
- {
- case "datitem":
- jtr.Read();
- JObject datItemObj = js.Deserialize(jtr);
- switch (datItemObj.Value("type").AsItemType())
- {
- case ItemType.Archive:
- datItem = datItemObj.ToObject();
- break;
- case ItemType.BiosSet:
- datItem = datItemObj.ToObject();
- break;
- case ItemType.Blank:
- datItem = datItemObj.ToObject();
- break;
- case ItemType.Disk:
- datItem = datItemObj.ToObject();
- break;
- case ItemType.Release:
- datItem = datItemObj.ToObject();
- break;
- case ItemType.Rom:
- datItem = datItemObj.ToObject();
- break;
- case ItemType.Sample:
- datItem = datItemObj.ToObject();
- break;
- }
-
+ case ItemType.Archive:
+ datItem = datItemObj.ToObject();
break;
-
- default:
+ case ItemType.BiosSet:
+ datItem = datItemObj.ToObject();
+ break;
+ case ItemType.Blank:
+ datItem = datItemObj.ToObject();
+ break;
+ case ItemType.Disk:
+ datItem = datItemObj.ToObject();
+ break;
+ case ItemType.Release:
+ datItem = datItemObj.ToObject();
+ break;
+ case ItemType.Rom:
+ datItem = datItemObj.ToObject();
+ break;
+ case ItemType.Sample:
+ datItem = datItemObj.ToObject();
break;
}
+ }
- jtr.Read();
+ // If we got a valid datitem, copy machine info and add
+ if (datItem != null)
+ {
+ datItem.CopyMachineInformation(machine);
+ datItem.Source = new Source { Index = indexId, Name = filename };
+ ParseAddHelper(datItem);
}
}