Right now, you are not transmitting JSON, you are transmitting data as it is (serialized $.param()) ... looks like this:
Name=something&Products%5B0%5D%5BProductCode%5D=product+1&Products%5B0%5D%5BProductName%5D=product+1&Products%5B1%5D%5BProductCode%5D=product+2&Products%5B1%5D%5BProductName%5D=product+2
To pass JSON, you need to strengthen it, for example:
data: JSON.stringify({ "Name": this.Name,
"Products": [{ "ProductCode": "product 1", "ProductName": "product 1" },
{ "ProductCode": "product 2", "ProductName": "product 2"}]
}),
:
{"Name":"something","Products":[{"ProductCode":"product 1","ProductName":"product 1"},{"ProductCode":"product 2","ProductName":"product 2"}]}
, . (< IE8), native JSON, json2.js, .