I know a custom Page Rule would serve as a hack to force the caching of anything. But we need to understand why Cloudflare is not respecting the Cache-Control public with max-age greater than 0 header as stated in the documentation. It should not be necessary to create Page Rules if the server response is correct.
Maybe the Vary header is bothering? Maybe the Last-Modified?
As stated in the documentation, JSON is not cached by default. The cache-control header is ignored for file extensions not in the list. The same applies to HTML, directory root requests and so on in case these contain dynamically produced data.
Use the new cache rules to force the caching you need.