Field type that is an integer, but accept some strings that means no value is provided? I have a field named "Price" that should allow anything from 0 - no maximum value, so I set it as an Integer and set 0 for the minimum value (and put a suffix to show up for the price).

However, the field contented is generated by parsing a JSON feed, and the feed owner sometimes puts "on demand" for some items, meaning the price can be negotiated on demand or the price is private and only shared when a client shows enough interest to buy.
The Feeds JSONPath Parser module parses the text string and doesn't import the fields with text for the Price field as it's not an Integer. Therefore resulting in a blank field input.

Should I replace all empty values with a 0 and then on view results set 0 to be rewritten to the "on demand" text? Or is there another way that I should explore?

I need to keep the Price field as an Integer since I use it for a range filter in my view.
If you have only one possible non-integer value, leave it as integer, just make it optional (not required). As far as I understand Feeds JSONPath Parser, non-integer value will simply get omitted, giving you no value for this field - exactly consistent as in fact you don't have that price.

Then in your template files check if it's set. If it isn't, show "on demand" string, with a link to make a demand or, well, anything you need.