When you look at the original jsonData variable in IE8, it displays like this:
This will luckily also detect as NOT an array with Ext.isArray(). So, knowing the data structure, I can do the following:
var fixed, items, t, i, transaction;
// This fix is here for ie8 and ie9 to turn the arrays back into arrays
if(!Ext.isArray(jsonData)) {
fixed = [];
for(t=0; t < jsonData.length; ++t) {
transaction = jsonData[t];
items = [];
for(i=0; i < transaction.items.length; ++i) {
items.push(transaction.items[i]);
}
transaction.items = items;
fixed.push(transaction);
}
jsonData = fixed;
}
And after I do that, the debug displays it as:
Notice that after my correction, the "object" has something called [Methods]. This makes it serialize correctly as a JSON array. What I'm suspecting is happening, but I can't completely prove due to IE's crappy toolset is that they do the conversion from array to object while parsing the script tag. This doesn't cause any operational issues within the browser because these array/objects support length, which allows for loop iteration, Ext.each works, they behave internally like arrays. But the serializer recognizes the difference and send them back the wrong way.
One other data point as to what is going comes from the javascript console
jsonData looks like an object, but behaves like an array, in that I can get a valid value back for jsonData.length (this is before I "correct" the array). And if I create a real object x, and try to get it's length, I get undefined which I would expect. So I'm going to chalk this one up to yet another IE defect. If anyone else hits this problem, at least it will be easier to solve.